01 什么是依赖注入
说到依赖注入,你是否脑海里会蹦出来一个词: 控制反转; 这个问题现在可以演变成以下三个问题:
- 什么是控制反转(IOC)?
- 什么是依赖注入(DI)?
- 控制反转和依赖注入有什么区别?
什么是控制反转(IOC)?
IOC算是spring最重要的一种思想设计,有了它之后,你再也不需要手动的去创建bean和管理bean,这些东西都交给了容器(Container)来管理;
这样做的目的其实也是为了降低两个有依赖关系对象的耦合度.这就是控制反转.
什么是依赖注入(DI)?
依赖注入它是指容器在运行时动态的将依赖对象注入到需要它们的对象中,从而实现对象之间的结耦!
控制反转和依赖注入有什么区别?
在Spring官方的文档中有这样的一句话:
IoC is also known as dependency injection (DI).
翻译过来的意思其实就是IOC也被称为DI。其实你可以这样理解,IOC其实是一种设计思想和原则,而依赖注入是实现IOC的一种手段.
02 依赖注入有哪些手段
依赖注入有三种常见的方式: 1.属性注入 2.构造器注入 3.setter注入
在Spring官方文档中有这种一句话:
DI exists in two major variants: Constructor-based dependency injection and Setter-based dependency injection.
DI存在两种主要的变体:构造器注入和setter注入;
对于属性注入这一手段官方不是很推荐实用,如果你用IDEA工具在开发工程中,会有提示让你换成构造器方式:
1
2
@Autowired
private OrderService orderService;
换成构造器方式如下:
1
2
3
4
private final OrderService orderService;
public UserService(OrderService orderService) {
this.orderService = orderService;
}
03 为什么官方推荐使用构造器而不是属性注入,有以下几个原因
- 构造器注入的对象是不可变的,但是属性注入的对象是可变的.
- 构造器注入的对象如果为null,在容器启动时就会报错,但是属性注入的方式在启动时不会报错,在调用时会报空指针异常;
- 完全初始化状态,这个可以跟上面的依赖不为空结合起来,向构造器传参之前,要确保注入的内容不为空,那么肯定要调用依赖组件的构造方法完成实例化。而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化父类,然后自己的成员变量,最后才是构造方法),所以返回来的都是初始化之后的状态.
名词解释
- IOC: Inversion of Control
- DI:Dependency Injection
一起学习一起成长