1、Inversion of Control 反射控制java
一、在spring中体现为“依赖注入”,具体方式就是:由spring的IoC Service Provider提供服务:spring
二、注入的具体方式:三种框架
(1)构造方法注入:这个简单,就是在声明一个构造方法,IoC Service Provider检查被注入对象的构造方法,而后为其注入依赖对象,所以,被注入对象的构造乃至整个生命周期都应该由IoC Service Provider管理ide
(2)setter注入方式:就是在类中提供getter/setter方法,方便spring在须要时注入有关类,固然setter的参数是一个接口测试
(3)接口注入方式:某类实现一个接口,IoC Service Provider经过该接口来了解应该为被注入对象注入什么依赖对象ui
这种方式虽然达到了依赖注入的目的,但被注入对象必须声明和实现另外的接口,即引入了另外的东西,显得有点画蛇添足。this
IoC的意义:从主动获取到依赖注入,到底有什么好处?大概有这样的:不会对业务对象形成很强的入侵性,使用IoC后,对象具备更好的可测试性、可重用性、可扩展性——————这些都是泛泛而谈,具体的做用,在项目中实践总结吧。编码
3.IoC的实现:IoC如何知道诸多对象间的对应关系,无非是这几种笨办法:直接编写代码来注册这些对应信息、XML文件记录对应信息、其余一切有效的方式spa
(1)直接编码的方式是在容器启动以前,咱们就经过程序编码的方式将被注入对象和依赖对象注册到容器中,并声明他们的依赖注入关系,例若有这样的代码:code
IoContainer container = ...; container.register(FXNewsProvider.class, new FXNewsProvider()); container.register(IFXNewsListener.class, new DowJonesNewsListener()); ... ... FXNewsProvider newsPrivoder = (FXNewsProvider)container.get(FXNewsProvider.class); newProvider.getAndPersistNews(); ...
简直说就是先在容器中注册好具体实例,当须要时就从容器中拿出来返回给咱们。在接口方式实现的时候,除了上面的代码外,还要加一个,将“注入标志接口”与相应的依赖对象绑定一下,才能让容器知道是怎样的对应关系。
IoContainer container = ...; container.register(FXNewsProvider.class, new FXNewsProvider()); container.register(IFXNewsListener.class, new DowJonesNewsListener()); ... container.bind(IFXNewsListenerCallable.class, container.get(IFXNewsListener.class)); ... FXNewsProvider newsPrivoder = (FXNewsProvider)container.get(FXNewsProvider.class); newProvider.getAndPersistNews(); ...
(2)xml配置文件方式,在spring配置文件中管理和保存依赖注入信息。
<bean id="newsProvider" class="..FXNewsProvider"> <property name="newsListener"> <ref bean="djNewsListener"/> </property> <property name="newPersistener"> <ref bean="djNewsPersister"/> </property> </bean> <bean id="djNewsListener" class="..impl.DowJonesNewsListener"> </bean> <bean id="djNewsPersister" class="..impl.DowJonesNewsPersister"> </bean>
读取配置文件完成装配,而后调用:
... container.readConfigurationFiles(...); FXNewsProvider newsProvide = (FXNewsProvider)container.getBean("newProvider"); newsProvider.getAndPersistNews(); ...
(3)元数据方式,表明实现是Google Guice,这是一套IoC框架,运用java注解来实现对象依赖注入
public class FXNewsProvider{ private IFXNewsListener newsListener; private IFXNewsPersister newsPersister; @Inject public FXNewsProvider(IFXNewsListener listener, IFXNewsPersister persister){ this.newsListener = listener; this.newsPersister = persister; } }
这里经过注解的方式,指明须要IoC Service Provider经过构造方法注入,余下的信息由Guice的Module提供。