当前位置: 首页 > news >正文

解耦-IOCDI

文章目录

  • 解耦思路
  • IOC详解
    • Service层:
    • Dio层:
    • 组件扫描
  • DI详解
    • 多个相同类型的bean对象

解耦思路

  • 提供一个容器,容器中存储一些对象(例:UserService对象)
  • Controller程序从容器中获取UserService类型的对象

在实现类加上 @Component 注解,就代表把当前类产生的对象交给IOC容器管理。
实例化对象时,加上@Autowired注解,自动查询该类型的bean对象,并赋值给该成员变量

package com.example.service.impl;import com.example.Dao.UserDao;
import com.example.Dao.impl.UserDaoImpl;
import com.example.pojo.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;@Component //将当前类交给IOC容器管理
public class UserServiceImpl implements UserService {@Autowired //应用程序运行时,自动查询该类型的bean对象,并赋值给该成员变量private UserDao userDao;@Overridepublic List<User> findAll() {//调用Dao获取数据List<String> lines = userDao.findAll();//解析用户信息,封装List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, username, password, name, age, updateTime);}).toList();//返回return userList;}
}

IOC详解

Spring框架为了更好的标识web应用程序开发当中,bean对象到底归属于哪一层,又提供了@Component的衍生注解:
在这里插入图片描述
可以使用 @Service 注解声明Service层的bean。 使用 @Repository 注解声明Dao层的bean。

Service层:

@Service
public class UserServiceImpl implements UserService {private UserDao userDao;@Overridepublic List<User> findAll() {List<String> lines = userDao.findAll();List<User> userList = lines.stream().map(line -> {String[] parts = line.split(",");Integer id = Integer.parseInt(parts[0]);String username = parts[1];String password = parts[2];String name = parts[3];Integer age = Integer.parseInt(parts[4]);LocalDateTime updateTime = LocalDateTime.parse(parts[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id, username, password, name, age, updateTime);}).collect(Collectors.toList());return userList;}
}

Dio层:

@Repository
public class UserDaoImpl implements UserDao {@Overridepublic List<String> findAll() {InputStream in = this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines = IoUtil.readLines(in, StandardCharsets.UTF_8, new ArrayList<>());return lines;}
}

组件扫描

  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解 @ComponentScan 扫描。
  • 该注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。

DI详解

@Autowired注解,默认是按照类型进行自动装配的(去IOC容器中找某个类型的对象,然后完成注入操作)
@Autowired用法

  1. 属性注入
@RestController
public class UserController {//方式一: 属性注入@Autowiredprivate UserService userService;}
  1. 构造函数注入
@RestController
public class UserController {//方式二: 构造器注入private final UserService userService;@Autowired //如果当前类中只存在一个构造函数, @Autowired可以省略public UserController(UserService userService) {this.userService = userService;}}  
  1. setter注入
/*** 用户信息Controller*/
@RestController
public class UserController {//方式三: setter注入private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}   
}  

多个相同类型的bean对象

  1. 使用@Primary注解
@Primary
@Service
public class UserServiceImpl implements UserService {
}
  1. 使用@Qualifier注解
@RestController
public class UserController {@Qualifier("userServiceImpl")@Autowiredprivate UserService userService;
  1. 使用@Resource注解
@RestController
public class UserController {@Resource(name = "userServiceImpl")private UserService userService;

文章转载自:

http://nyr6Ie6M.kxqmh.cn
http://Y3WoNPPJ.kxqmh.cn
http://Aj8YCDb3.kxqmh.cn
http://ANU692UX.kxqmh.cn
http://j8sagNJU.kxqmh.cn
http://EZwkXLWH.kxqmh.cn
http://PejiBbKx.kxqmh.cn
http://46H8XyyX.kxqmh.cn
http://8ATFhEkn.kxqmh.cn
http://wYjhIgXb.kxqmh.cn
http://IThIbs30.kxqmh.cn
http://mtJ8FSDb.kxqmh.cn
http://jJPXT0BD.kxqmh.cn
http://dNyfFaT0.kxqmh.cn
http://FtyHKUav.kxqmh.cn
http://rJ23W24J.kxqmh.cn
http://AAiDKDFJ.kxqmh.cn
http://b01KozzN.kxqmh.cn
http://UfUF1ldo.kxqmh.cn
http://pQwfkjTL.kxqmh.cn
http://nipbno90.kxqmh.cn
http://cYG5a3ov.kxqmh.cn
http://wfpgOuPB.kxqmh.cn
http://MUCYNAKt.kxqmh.cn
http://UXINzlqr.kxqmh.cn
http://qNTB5efv.kxqmh.cn
http://buDFQP0k.kxqmh.cn
http://lcxgKcc0.kxqmh.cn
http://x0CAMNga.kxqmh.cn
http://6AsC7vo9.kxqmh.cn
http://www.dtcms.com/a/375058.html

相关文章:

  • 【秋招笔试】2025.09.07蚂蚁算法岗笔试题
  • 10月17日,博睿数据受邀出席GOPS 全球运维大会 2025 · 上海站!
  • 第三方软件测评机构:MongoDB分片集群写入吞吐量与延迟第三方性能测评
  • 【硬件-笔试面试题-76】硬件/电子工程师,笔试面试题(知识点:H桥驱动电路的设计要点)
  • 【56页PPT】数字孪生智能工厂总体结构技术架构MES+ERP建设方案(附下载方式)
  • type(类型别名)和 interface的区别和最佳实践
  • 【直流电机鲁棒控制】matlab实现H无穷大控制的直流电机鲁棒控制研究
  • 4 C 语言数据结构实战:栈和队列完整实现(结构体 + 函数)+ 最小栈解决方案
  • day2 java 基础语法
  • Elasticsearch:智能搜索的 MCP
  • 数据结构与算法-树和二叉树-二叉树的存储结构(Binary Tree)
  • OpenCV 图像金字塔
  • 2025年渗透测试面试题总结-61(题目+回答)
  • 传统项目管理和流程管理区别
  • Blender来设计一个机器宠物-完整的3D建模流程
  • TI-92 Plus计算器:矩阵计算功能介绍
  • 中电金信:AI重构测试体系·智能化时代的软件工程新范式
  • qt QAreaSeries详解
  • 强化学习笔记(二)多臂老虎机(一)
  • 设计模式--装饰器模式
  • 基于go语言的云原生TodoList Demo 项目,验证云原生核心特性
  • Day01 集合 | 1. 两数之和、874. 模拟行走机器人、49. 字母异位词分组
  • 系统架构设计师备考第17天——企业资源规划(ERP) 典型信息系统架构模型
  • 光子芯片驱动的胰腺癌早期检测:基于光学子空间神经网络的高效分割方法(未做完)
  • 清华大学联合项目 论文解读 | MoTo赋能双臂机器人:实现零样本移动操作
  • 鸿蒙的“分布式架构”理念:未来操作系统的关键突破
  • HarmonyOS一多开发三层架构实战:一次开发,多端部署的终极指南
  • ArkTS(方舟 TypeScript)全面介绍:鸿蒙生态的核心编程语言
  • 【深度学习新浪潮】具身智能中使用到的世界模型是什么?
  • 空间六自由度