BeanFactory
体系结构
BeanFactory
:定义了获取、检查Bean的相关方法,如getBean、containsBean、isSingleton等。ListableBeanFactory
:该接口定义了访问容器中Bean基本信息的若干方法,如查看Bean的个数、获取某一类型Bean的配置名、查看容器中是否包含某一Bean等方法。HierarchicalBeanFactory
:父子级联IoC容器的接口,子容器可以通过接口方法访问父容器。AutowireCapableBeanFactory
:定义了将容器中的Bean按照某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法。SingletonBeanRegistry
:定义了允许在运行期间向容器注册单实例Bean的方法。BeanDefinitionRegistry
:Spring配置文件中每一个节点元素在Spring容器里都通过一个BeanDefinition对象表述,它描述了Bean的配置信息。而BeanDefinitionRegistry接口提供了向容器手工注册BeanDefinition对象的方法。
BeanFactory中Bean的生命周期
ApplicationContext
体系结构
ApplicationEvenPublisher
:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。实现了ApplicationListener事件监听接口的Bean可以接收到容器事件,并对事件进行响应处理。在AppliciationContext抽象实现类AbstractApplicationContext中,存在一个ApplicationEvenMulticaster,它负责保存所有监听器,以便容器产生上下事件时通知这些事件监听器。MessageSource
:为应用提供il8n国际化消息访问的功能。ResourcePatternResolver
:让所有ApplicationContext实现类都实现了类似于PathMatchingResourcePatternResolver的功能,可以通过带前缀的Ant风格的资源文件路径装载Spring的配置文件。LifeCycle
:该接口在Spring2.0加入,该接口提供了start()和stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被ApplicationContext实现及具体Bean实现,ApplicationContext会将start、stop的信息传递给容器中所用实现了该接口的Bean,以达到管理和控制JMX、任务调度等目的
ApplicationContext中Bean的生命周期
Spring容器技术内幕
/**
* Load or refresh the persistent representation of the configuration,
* which might an XML file, properties file, or relational database schema.
* <p>As this is a startup method, it should destroy already created singletons
* if it fails, to avoid dangling resources. In other words, after invocation
* of that method, either all or no singletons at all should be instantiated.
* @throws BeansException if the bean factory could not be initialized
* @throws IllegalStateException if already initialized and multiple refresh
* attempts are not supported
*/
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
上述代码与上图Bean的生命周期都有对应的代码。
- Bean完整的生命历程
参考书籍下载地址:Spring3.x企业应用开发实战
博客:一天不进步,就是退步!