一、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; } }