百度查询即可(控制反转)
IOC主要实现策略来源- Using a service locator pattern 服务定位模式( )
- 依赖注入
- 构造器注入
- 参数注入
- setter注入
- 接口注入
- 上下文的依赖查询
- 模板方法设计模式
- 策略模式
IOC的轻量级可以大体分为两种:依赖查找,依赖注入
轻量级的好处:提高部署效率以及减少性能开销
低内存的消耗,不过多的去调用容器API
| 类型 | 依赖处理 | 实现便利性 | 代码入侵性 | API依赖性 | 可读性 |
|---|---|---|---|---|---|
| 依赖查找 | 主动获取 | 相对繁琐 | 侵入业务逻辑 | 依赖容器API | 良好 |
| 依赖注入 | 被动提供 | 相对便利 | 低入侵性 | 不依赖容器API | 一般 |
-
依赖处理:
- 主动获取:需要指定注入的类型已经包的名称
- 被动提供:根据某种规则注入,不需要手动去查找(@Autowired)
-
代码入侵性:当你的代码引入了一个组件,导致其它代码或者设计,要做相应的更改以适应新组件.这样的情况我们就认为这个新组件具有侵入性
-
API依赖性:直接的说法就是需要使用容器中的某个接口,不依赖的话就好比使用setter注入,看不到容器API的调用;
构造器注入 VS. Setter注入 构造器注入不依赖容器API和不依赖API不代表没有入侵性
Spring的团队鼓励使用构造器注入,但是如果一个类里面的成员参数过多的话,会导致构造器很臃肿,这个时候 就需要考虑重构,使得一个类里面不包含过多的参数。构造器里面的参数建议设置为final,如果注入为空的话,可以使用ObjectProvider
@Component
public class ObjectProviderDemo {
private ComponentDemo componentDemo;
public ObjectProviderDemo(ObjectProvider componentDemo) {
this.componentDemo = componentDemo.getIfAvailable();
}
public void test() {
componentDemo.eat();
}
}
Setter注入在业务开发的时候不推荐使用ObjectProvider,因为可能会导致由启动报错编程业务报错,需要避免业务阶段报错;
优点:
- Setter注入可用于可选性的注入(选择自己需要注入的字段)
- Setter可以让对象有一个默认值,并不需要在运行阶段提供属性注入。(Setter Injection works well for objects that have default values, meaning that not all properties need to be supplied at runtime)
缺点:
- 在setter的时候没有一个初始化的顺序,然后在构造器里面,如果age在name前面那么则会先初始化age
综上所述:大佬更加推荐使用构造器,当对象一旦创建,就并不希望他发生改变
Spring作为IOC容器有什么优势?- 典型的IOC管理,依赖查找和依赖注入
- AOP抽象
- 事务抽象
- 事件机制(EventObject, EventListener)
- SPI扩展
- 强大的第三方整合
- 易测试性
- 更好的面向对象



