Spring更简单的读取对象Bean
IoC 和 DI 是 Spring 中最重要的两个概念,其中 IoC(Inversion of Control)为控制反转的思想,而 DI(Dependency Injection)依赖注入为其(IoC)具体实现。那么 DI 实现依赖注入的方式有几种?这些注入方式又有什么不同?
一. 读取方法
1. 属性注入
最核心的代码
@Autowired
public UserService userService;
1.1 优点
属性注入最大的优点就是实现简单、使用简单,只需要给变量上添加一个注解(@Autowired),就可以在不 new 对象的情况下,直接获得注入的对象了,所以它的优点就是使用简单。
1.2 缺点
- 功能性问题:无法注入一个不可变的对象(final 修饰的对象);
- 通用性问题:只能适应于 IoC 容器;
- 设计原则问题:更容易违背单一设计原则。
2. Setter注入
核心代码
public UserService userService;/*使用@Autowired注解,引入UserService类*/
//在一个类中调用另一个类
@Autowired/*Setter注入*/
public void setUserService(UserService userService) {
this.userService = userService;
}
从上面代码可以看出,Setter 注入比属性注入要麻烦很多。
要说 Setter 注入有什么优点的话,那么首先就是它完全符合单一职责的设计原则,因为每一个 Setter 只针对一个对象。
但它的缺点也很明显:
-
不能注入不可变对象(final 修饰的对象)
-
注入的对象可被修改
3. 构造方法注入
public UserService userService;
@Autowired/*构造方法注入*/
public UserController(UserService userService) {
this.userService = userService;
}
构造方法注入相比于前两种注入方法,它可以注入不可变对象,并且它只会执行一次,也不存在像 Setter 注入那样,被注入的对象随时被修改的情况,它的优点有以下 4 个:
-
可注入不可变对象;
-
注入对象不会被修改;
-
注入对象会被完全初始化;
-
通用性更好
二. 注入关键字
除了 @Autowired,还可以使用另一个关键字
@Resource
@Autowired 和 @Resource 的区别
- 出身不同
@Autowired 来自于 Spring,而 @Resource 来自于 JDK 的注解 - 使用时设置的参数不同
相比于 @Autowired 来说,@Resource 支持更多的参数设置,例如
name 设置,根据名称获取 Bean - @Autowired 可用于 Setter 注入、构造函数注入和属性注入,而 @Resource 只能用于 Setter 注入和属性注入,不能用于构造函数注入