news 2026/4/15 9:45:46

IOC(控制反转)和DI(依赖注入)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IOC(控制反转)和DI(依赖注入)详解

一、IOC容器

链接:IOC与DI的详解来源

注意:上个文章里面带过了就不写了

1.这是启动类代码(放在当前启动类所在包下才能扫描完

package com.itheima.springbpptweb01; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // 具备组件扫描的作用 public class SpringbpptWeb01Application { public static void main(String[] args) { SpringApplication.run(SpringbpptWeb01Application.class, args); } }

2.小结

二、DI(依赖注入)

1.基于@Autowired进行依赖注入的常见方式有如下三种:

(1)属性注入(企业快速开发常用的方式)

@RestController // 包装了Conroller public class UserController { //方式一:(快速开发用第一种) @Autowired private UserService userService; @RequestMapping("/list") public List<User> list() throws FileNotFoundException { // 1.调用service,获取数据 List<User> userList = userService.findAll(); //3.返回数据(josn) v return userList; } }

优点:代码简洁、方便快速开发。

缺点:隐藏了类之间的依赖关系、可能会破坏类的封装性。

(2)构造函数注入(要求代码规范性的方式,Spring官方推荐的方法

@RestController // 包装了Conroller public class UserController { 方式二:构造器注入(规范开发用第二种) private final UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } @RequestMapping("/list") public List<User> list() throws FileNotFoundException { // 1.调用service,获取数据 List<User> userList = userService.findAll(); //3.返回数据(josn) v return userList; } }

优点:能清晰的看到类的依赖关系、提高了代码的安全性。

缺点:代码繁琐、如果构造参数过多,可能会导致构造函数臃肿。

注意:如果只有一个构造函数,@Autowired注解可以省略。

(3)setter函数注入

@RestController // 包装了Conroller public class UserController { // 方式三:setter方法注入 private UserService userService; @Autowired public void setUserService(UserService userService) { this.userService = userService; } @RequestMapping("/list") public List<User> list() throws FileNotFoundException { // 1.调用service,获取数据 List<User> userList = userService.findAll(); //3.返回数据(josn) v return userList; } }

优点:保持了类的封装性,依赖关系更清晰。

缺点:需要额外编写setter方法,增加了代码量。

2.DI详解

2.1 先知:

2.2 解决方案

(1) 方案一:@Primary

简化版:

应用版:

@Primary // 默认使用这个提高他的优先级 @Service public class UserServiceImpl implements UserService{ @Autowired // 用多态创建UserDao private UserDao userDao; @Override public List<User> findAll() { // 1.调用dao层方法获取 数据 List<String> list = userDao.findAll(); //2.解析用户信息,封装为user对象 -> list集合 List<User> userList =list.stream().map(line -> { String[] items = line.split(","); Integer id = Integer.parseInt(items[0]); String username = items[1]; String password = items[2]; String name = items[3]; Integer age = Integer.parseInt(items[4]); LocalDateTime updateTime = LocalDateTime.parse(items[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); return new User(id,username,password,name,age,updateTime); }).toList(); return userList; } }
(2)方案二:@Qualifier

简化版:

应用版:

@RestController // 包装了Conroller public class UserController { @Autowired @Qualifier("userServiceImpl") //指定要注入的bean的名字 private UserService userService; @RequestMapping("/list") public List<User> list() throws FileNotFoundException { // 1.调用service,获取数据 List<User> userList = userService.findAll(); //3.返回数据(josn) v return userList; } }
(3)方案三:@Resource

简化版:

应用版:

@RestController // 包装了Conroller public class UserController { @Resource(name="userServiceImpl2") private UserService userService; @RequestMapping("/list") public List<User> list() throws FileNotFoundException { // 1.调用service,获取数据 List<User> userList = userService.findAll(); //3.返回数据(josn) v return userList; } }
(4)注意:
为什么我们要指定名字呢?因为我们在无论是dao,service下都会有一个统一接口,然后写多个实现类去实现它,但是调用的时候不知道要用哪个实现类,所以需要用指定名字。这样就轻松实现了解耦。

3.小结

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/9 21:01:55

5分钟快速上手SMUDebugTool:AMD电源调试的完整解决方案

5分钟快速上手SMUDebugTool&#xff1a;AMD电源调试的完整解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…

作者头像 李华
网站建设 2026/4/12 0:48:36

5分钟掌握Windows防休眠工具:NoSleep永不锁屏终极指南

5分钟掌握Windows防休眠工具&#xff1a;NoSleep永不锁屏终极指南 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 你是否遇到过这些令人烦恼的场景&#xff1f;正在为客户演示…

作者头像 李华
网站建设 2026/4/12 2:34:02

PPTTimer:5大核心功能助你精准掌控演示时间

PPTTimer&#xff1a;5大核心功能助你精准掌控演示时间 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 在各类演讲、汇报和教学演示中&#xff0c;时间管理始终是影响成败的关键因素。PPTTimer作为一款专业的演…

作者头像 李华
网站建设 2026/4/14 15:35:33

AMD Ryzen处理器调试利器:5个技巧让你轻松玩转SMUDebugTool

还在为AMD处理器性能调优而苦恼吗&#xff1f;想要深入掌握Ryzen平台的底层参数调节却无从下手&#xff1f;今天我们就来聊聊这款专业的硬件调试工具——SMUDebugTool&#xff0c;看看它是如何帮你打开处理器性能调优的新世界&#xff01; 【免费下载链接】SMUDebugTool A dedi…

作者头像 李华
网站建设 2026/4/12 17:31:41

成本意识在研发管理中如何落实

要在研发管理中有效落实成本意识&#xff0c;核心在于推动一个根本性的思维转变&#xff1a;即从被动的“成本控制”转向主动的“价值投资”。这绝非简单的“省钱”或“砍预算”&#xff0c;而是要求将“投入产出比&#xff08;ROI&#xff09;”的核算&#xff0c;系统性地融入…

作者头像 李华
网站建设 2026/4/10 16:09:40

从 ScriptProcessor 到 AudioWorklet:Electron 桌面端录音实践总结

实践总结开发 Electron 桌面端应用时&#xff0c;我遇到了一个常见但又棘手的问题&#xff1a;录音功能。本文将分享我的实践经历&#xff0c;包括为什么 ScriptProcessor 蓝屏、为什么 AnalyserNode 会导致音频噪声&#xff0c;以及最终使用 AudioWorklet 的完整解决方案。一、…

作者头像 李华