控制反转与依赖注入通俗描述

控制反转(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();
}
.....
}
}
相关文章
相关标签/搜索