??????控制反轉包括兩種類型:依賴查找(Dependency Lookup)和依賴注入(Dependency Injection),我們主要討論的是依賴注入。
????? 依賴注入可以分為兩種類型:構造子注入(Constructor Dependency Injection)和設值注入(Setter Dependency Injection)
????? 構造子注入,組件的依賴關系是通過構造函數來提供的,每個依賴關系對應構造函數的各個參數,IOC容器在實例化組件時,通過構造函數注入依賴關系。
public class ConstructorInjection {
??? private Dependency dep;
??? public ConstructorInjection(Dependency dep) {
??????? this.dep = dep;
??? }
}
構造子注入適用于在使用某個組件之前,確保所有的依賴關系都已注入。
????? 設值注入,組件的依賴關系是通過JavaBean形式的setter方法注入的,IOC容器通過調用相應的set方法注入依賴關系。
public class SetterInjection {
??? private Dependency dep;
??? public void setMyDependency(Dependency dep) {
??????? this.dep = dep;
??? }
}
設值注入適用于需要給某些依賴關系提供默認值的情況。
????? Spring IOC容器的核心是BeanFactory,BeanFactory負責管理組件以及組件間的依賴關系。術語bean在Spring中代表由容器管理的任何組件。Spring提供了兩種常用的BeanFactory實現:DefaultListableBeanFactory和XmlBeanFactory。
????? 在BeanFactory中,每個bean都至少有一個名稱,作為唯一標識,如果bean擁有多個名稱的話,那么除第一個名稱外的其它名稱都將被認為是別名。
????? DefaultListableBeanFactory可以使用PropertiesBeanDefinitionReader或者XmlBeanDefinitionReader(當然還可以是其它任何實現了BeanDefinitionReader接口的Bean定義讀取器)來讀取配置文件。
//使用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配置文件時可以簡化代碼的編寫,這也是我們最常用的BeanFactory。
private static BeanFactory getBeanFactory() throws Exception {
??? XmlBeanFactory factory =
??????? new XmlBeanFactory(new FileSystemResource("ch4/src/conf/beans.xml"));
????return factory;
}
????? 獲得了BeanFactory對象后,我們就可以使用bean的名稱來獲取我們需要的組件對象了。
Oracle oracle = (Oracle)factoyr.get("oracle");