??????控制反轉(zhuǎn)包括兩種類(lèi)型:依賴查找(Dependency Lookup)和依賴注入(Dependency Injection),我們主要討論的是依賴注入。
????? 依賴注入可以分為兩種類(lèi)型:構(gòu)造子注入(Constructor Dependency Injection)和設(shè)值注入(Setter Dependency Injection)
????? 構(gòu)造子注入,組件的依賴關(guān)系是通過(guò)構(gòu)造函數(shù)來(lái)提供的,每個(gè)依賴關(guān)系對(duì)應(yīng)構(gòu)造函數(shù)的各個(gè)參數(shù),IOC容器在實(shí)例化組件時(shí),通過(guò)構(gòu)造函數(shù)注入依賴關(guān)系。
public class ConstructorInjection {
??? private Dependency dep;
??? public ConstructorInjection(Dependency dep) {
??????? this.dep = dep;
??? }
}
構(gòu)造子注入適用于在使用某個(gè)組件之前,確保所有的依賴關(guān)系都已注入。
????? 設(shè)值注入,組件的依賴關(guān)系是通過(guò)JavaBean形式的setter方法注入的,IOC容器通過(guò)調(diào)用相應(yīng)的set方法注入依賴關(guān)系。
public class SetterInjection {
??? private Dependency dep;
??? public void setMyDependency(Dependency dep) {
??????? this.dep = dep;
??? }
}
設(shè)值注入適用于需要給某些依賴關(guān)系提供默認(rèn)值的情況。
????? Spring IOC容器的核心是BeanFactory,BeanFactory負(fù)責(zé)管理組件以及組件間的依賴關(guān)系。術(shù)語(yǔ)bean在Spring中代表由容器管理的任何組件。Spring提供了兩種常用的BeanFactory實(shí)現(xiàn):DefaultListableBeanFactory和XmlBeanFactory。
????? 在BeanFactory中,每個(gè)bean都至少有一個(gè)名稱,作為唯一標(biāo)識(shí),如果bean擁有多個(gè)名稱的話,那么除第一個(gè)名稱外的其它名稱都將被認(rèn)為是別名。
????? DefaultListableBeanFactory可以使用PropertiesBeanDefinitionReader或者XmlBeanDefinitionReader(當(dāng)然還可以是其它任何實(shí)現(xiàn)了BeanDefinitionReader接口的Bean定義讀取器)來(lái)讀取配置文件。
//使用PropertiesBeanDefinitionReader
private static BeanFactory getBeanFactory() throws Exception {
??? // get the bean factory
??? DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
??? // create a definition reader
??? PropertiesBeanDefinitionReader rdr = new PropertiesBeanDefinitionReader(factory);
??? // load the configuration options
??? Properties props = new Properties();
??? props.load(new FileInputStream("./ch2/src/conf/beans.properties"));
??? rdr.registerBeanDefinitions(props);
??? return factory;
}
//使用XmlBeanDefinitionReader
private static BeanFactory getBeanFactory() throws Exception {
??? // get the bean factory
??? DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
??? // create a definition reader
??? XmlBeanDefinitionReader rdr = new XmlBeanDefinitionReader(factory);
??? // load the configuration options
??? rdr.loadBeanDefinitions(new FileSystemResource("ch4/src/conf/beans.xml"));
????return factory;
}
????? XmlBeanFactory繼承了DefaultListableBeanFactory,在使用XML配置文件時(shí)可以簡(jiǎn)化代碼的編寫(xiě),這也是我們最常用的BeanFactory。
private static BeanFactory getBeanFactory() throws Exception {
??? XmlBeanFactory factory =
??????? new XmlBeanFactory(new FileSystemResource("ch4/src/conf/beans.xml"));
????return factory;
}
????? 獲得了BeanFactory對(duì)象后,我們就可以使用bean的名稱來(lái)獲取我們需要的組件對(duì)象了。
Oracle oracle = (Oracle)factoyr.get("oracle");