控制反转(Inversion of Control) 是一种设计原则,依赖注入(Dependency Injection)是Ioc的实现方式之一(另一种叫依赖查找)
技术描述
Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式地用 new 创建 B 的对象。
采用依赖注入技术之后,A 的代码只需要定义一个 private 的B对象,不需要直接 new 来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。
IoC也可以理解为把流程的控制从应用程序转移到框架之中。 以前,应用程序掌握整个处理流程;现在,控制权转移到了框架,框架利用一个引擎驱动整个流程的执行,框架会以相应的形式提供一系列的扩展点,应用程序则通过定义扩展的方式实现对流程某个环节的定制,“框架Call应用”。基于MVC的web应用程序就是如此。
例子:(我理解的)
// 无ioc
class A {
private B b = new B();
}
// 用ioc的思想
class A {
@Autowired
private B b;
}
DI的原理
根据依赖关系,依次创建对象。如:要创建A,需要先创建其依赖的B。
随着我们不断引入更多的依赖关系,这种复杂性将继续增长。为了解决这个复杂问题,我们需要基于依赖关系树抽取对象的创建过程。这就是依赖注入框架。
spring的注入方法有几种?
-
构造方法注入
-
字段注入
- 注意:在使用字段之前,将无法检查自动注入的对象是否为空。
-
setter注入