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

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.小结

http://www.cnnetsun.cn/news/188014.html

相关文章:

  • Python自动化工具的终极方案:快速获取同花顺问财数据的完整指南
  • Jellyfin Android TV播放功能优化终极指南
  • 5分钟快速上手:网易云NCM文件解锁终极指南
  • [特殊字符] 解放双手!这款PPT悬浮计时器让演讲时间管理变得如此简单
  • PPT演示必备神器:悬浮计时器高效控时秘诀大公开
  • 免费终极视频修复工具:轻松拯救损坏的MP4文件
  • 跨平台MSG文件查看神器:让邮件处理不再有系统障碍
  • 城通网盘下载加速终极方案:轻松获取直连高速下载地址
  • 硬件调试革命:85%性能提升的AMD系统优化方案
  • ncmdumpGUI终极指南:3分钟解锁网易云NCM加密音乐
  • MouseTester终极指南:3步免费检测鼠标性能的完整方案
  • PPTTimer:5大核心功能助你成为专业演讲者
  • 如何快速修复损坏视频:免费开源工具的完整指南
  • Elasticsearch集群状态维护实战案例
  • ncmdumpGUI:让网易云音乐解锁跨设备自由播放的实用工具
  • 三步解锁小米AI音箱隐藏技能:从语音助手到智能管家的完美蜕变
  • PPTTimer悬浮计时器:3分钟快速掌握演讲时间管理的实用指南
  • SMUDebugTool终极指南:解锁AMD Ryzen平台性能潜能的专业调试工具
  • 智能硬件调试实战:掌握SMUDebugTool的系统性能优化技巧
  • 终极免费视频修复工具:Untrunc完整使用指南
  • 小红书直播录制黑科技:永久地址+智能监控,告别手动烦恼
  • 5分钟快速上手:PPTTimer悬浮时钟的终极使用指南
  • WeiboSpider终极指南:轻松掌握微博数据采集全流程
  • 三步搞定网易云NCM文件转换:ncmdumpGUI实用指南
  • Windows虚拟显示器实战指南:打造无限扩展的数字工作空间
  • PPT演讲时间管理的终极解决方案:智能悬浮计时器完整指南
  • Visual Paradigm AI 魚骨圖產生器深度實測:利用人工智慧革新根本原因分析
  • ncmdumpGUI网易云音乐解密工具终极指南:从问题诊断到完美解决方案
  • 3步精通PyWenCai:股票数据获取的完整解决方案
  • 面试了几十家软件测试公司全是这个“套路”