控制反转(IOC):java
由框架或其余某些东西来控制须要调用的事件处理器或其余东西,而不是由业务逻辑决定。spring
举例:spring中的bean,咱们在spring项目中配置了datasource后,不须要关注如何调用它,调用它这个工做交给spring,咱们只须要关注咱们的真正业务。数据库
这样主控被反转了。控制权从业务逻辑中转移到其余地方。数据库操做典型的例子:打开和关闭链接。框架
IoC的不一样实现:1.工厂模式 2.服务定位器模式 3.依赖注入(DI)ide
IoC会确保一个可重用的依赖项会被配置成单例。.net
依赖注入(DI):调试
依赖注入是IoC的一种特定形态,是指寻找依赖项的过程不在当前执行代码的直接控制之下。固然咱们也能够本身写代码实现依赖注入。code
注:把依赖项注入对象的方法有不少种,可使用专门的DI框架,也能够显示的建立对象实例(依赖项)并把它们传入对象中也能够和框架注入达到一样效果。对象
DI的几个明显特色:松耦合,易测性,内聚性(专一业务),可重用,代码更少。接口
发展:
JAVA DI标准化方式JSR-330进行统一的规范依赖注入,2009年 JSR-299在300基础上规范企业应用提供标准化配置。实现是 javax.inject。
了解依赖注入机制的内部工做原理能够解决不少常见的问题:
1.依赖项配置错误,2.依赖项诡异的超出做用域,3.依赖项在不应共享时被共享以及分布调试离奇跌机。
javax.inject包含一个 Provider<T> 接口 和 5个注解类型 @Inject @Qualifier @Named @Scope @Singleton
详解:
@Inject 范围: 1.构造器,2.方法 ,3.属性
在构造器上使用时,构造器的参数会在运行时有配置好的IoC容器提供。在不含参数的构造器上使用Inject也合法。
注:JRE没法决定构造器注入的优先级,因此规范中规定类中只能有一个构造器带@Inject注解。
在方法上使用时,不能声明方法为抽象的。也不能声明其自身的类型参数。
@ Qualifier
用于区别两个相同类型的对象。JSR330要求全部IOC容器都必须提供一个默认的@Qualifier注解。@Named--用来给两个相同类型的对象设置不一样的别名
@Scope
用于定义注入器(IOC容器)对注入对象的重用方式。
若是没有声明该注解,IOC应该建立注入对象而且仅使用该对象一次。
@ Singleton
在须要注入一个不会改变的对象时就要用 @ Singleton
Provider<T>
若是要对由DI框架注入代码中的对象有更多控制权,能够要求DI框架将Provider<T>接口实现注入对象。这样,
1.能够获取该对象的多个实例
2.能够延迟获取该对象
3.能够打破循环依赖
4.能够定义做用域
该接口仅有一个T get()方法,返回一个注入好的注入对象T。
Class Mur{ @Inject Mur (Provider<Message> messageProvider){ Message m1=messageProvider.get(); if(someGlobalCondition){ Message copyMsg1=messageProvider.get(); } ..... } }