控制反转包括两种类型:依赖查找(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");