在Spring IOC容器的设计中,可以看到两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境做了许多适配。
BeanFactory接口的第一行有这样一段代码
<span style="font-size:18px;">String FACTORY_BEAN_PREFIX = "&";</span>
这BeanFactory接口中,定义了如下方法:
Object getBean(String name) throws BeansException; <T> T getBean(String name, Class<T> requiredType) throws BeansException; <T> T getBean(Class<T> requiredType) throws BeansException; Object getBean(String name, Object... args) throws BeansException; <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
<span style="font-size:18px;">boolean containsBean(String name);</span>
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException;
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
String[] getAliases(String name);
XMLBeanFactory是BeanFactory的最简单、也是常用的实现类
public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); /** * Create a new XmlBeanFactory with the given resource, * which must be parsable using DOM. * @param resource XML resource to load bean definitions from * @throws BeansException in case of loading or parsing errors */ public XmlBeanFactory(Resource resource) throws BeansException { this(resource, null); } /** * Create a new XmlBeanFactory with the given input stream, * which must be parsable using DOM. * @param resource XML resource to load bean definitions from * @param parentBeanFactory parent bean factory * @throws BeansException in case of loading or parsing errors */ public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); } }
根据源码可以看出,XMLBeanFactory的构造需要指定BeanDefinition 的来源,这个源自于Resouce的封装。这样IOC容器就可以利用BeanDefinition进行容器的初始化和依赖注入过程。
实际上整个BeanFactory的构建过程由如下几步完成
(1) 指定一个BeanDefinition的来源,这里用的是Resouce类
(2) 定义一个IOC容器,即XMLBeanFactory ,也可以认为是DefaultListableBeanFactory,这时这个容器还是空的,里面什么都没有
(3) 需要在BeanDefinition和IOC容器之间建立起关系,在XMLBeanFactory中使用的是XmlBeanDefinitionReader,它将完成完成IOC容器的配置,这个时候IOC容器就建立完成。
在BeanFactory的初始化时候,不会初始化所有的Bean,而是在getBean的时候才进行Bean的初始化
这是BeanFactory的继承体系中,一个位于中间位置的接口,它在BeanFactory的基础上,提供了一些更高级的功能。
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver
ApplicationContext的常用实现类是ClassPathXmlApplicationContext, FileSystemXmlApplicationContext和AnnotationConfigApplicationContext,如果在Web中使用Spring容器,则通常有XmlWebApplicationContext和AnnotationConfigWebApplicationContext两个实现类。
在ApplicationContext初始化时,默认会预初始化所有的sigletonBean。这意味着在系统创建ApplicationContext时有较大的开销