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提供。