Spring中有一些能够扩展的接口,能够用来在工做中更深度的使用Spring,这些接口大多分布在AbstractApplicationContext.refresh() 和 AbstractAutowireCapableBeanFactory.createBean()这两个方法的执行过程当中。java
AbstractApplicationContext.refresh()是Spring环境启动 过程当中的一个重要方法,此方法中实例化了全部的bean,任何ApplicationContext的实现,都须要调用此方法。spring
为节省篇幅,仅将要分析的几个方法代码片断抽取出来,refresh()的所有实现可查看源码中的AbstractApplicationContext.refresh()方法。app
// 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);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Check for listener beans and register them.
registerListeners();
复制代码
调用了initPropertySources,初始化资源,如属性文件中的占位符等。 由子类实现,如AbstractRefreshableWebApplicationContext。post
获取ConfigurableListableBeanFactory:this
protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
refreshBeanFactory();
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
if (logger.isDebugEnabled()) {
logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
}
return beanFactory;
}
复制代码
此方法中主要执行两部分流程:spa
调用抽象方法refreshBeanFactory(),由子类AbstractRefreshableApplicationContext实现,代码片断以下:debug
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory); //读取xml,注册BeanDefinition。
复制代码
loadBeanDefinitions是AbstractRefreshableApplicationContext的一个抽象方法,由其子类AbstractXmlApplicationContext实现 ,详细了解AbstractXmlApplicationContext可参考Spring自定义配置的源码解析与实现3d
调用抽象方法getBeanFactory(),由子类AbstractRefreshableApplicationContext实现,返回一个接口ConfigurableListableBeanFactory的实现类DefaultListableBeanFactory的实例。代理
这个DefaultListableBeanFactory实例,由上面的refreshBeanFactory()中调用createBeanFactory()建立。code
配置ConfigurableListableBeanFactory。
ConfigurableListableBeanFactory继承了BeanFactory,实现类是DefaultListableBeanFactory。
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory){....}
beanFactory.setBeanClassLoader(getClassLoader());
经过org.springframework.util.ClassUtils.getDefaultClassLoader()获取ClassLoader。
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
建立ApplicationContextAwareProcessor对象,而且添加到DefaultListableBeanFactory中。
ApplicationContextAwareProcessor实现了BeanPostProcessor,并在实现的BeanPostProcessor.postProcessBeforeInitialization中,定义了对一些列对org.springframework.beans.factory.Aware子接口的处理。
注:这里只是添加了BeanPostProcessor,但并未执行。
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
}
}
复制代码
在后续建立Bean的流程中,会执行全部的BeanPostProcessor,也就是会执行ApplicationContextAwareProcessor.postProcessBeforeInitialization设置各类Aware接口。
注册Spring自身使用的一些Bean:
// Register default environment beans.
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
复制代码
其中:
String ENVIRONMENT_BEAN_NAME = "environment";
String SYSTEM_PROPERTIES_BEAN_NAME = "systemProperties";
String SYSTEM_ENVIRONMENT_BEAN_NAME = "systemEnvironment";
复制代码
调用全部的 BeanFactoryPostProcessor.postProcessBeanFactory。 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors){....}
复制代码
注册全部的BeanPostProcessor
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
复制代码
初始化ApplicationEventMulticaster,实现类是SimpleApplicationEventMulticaster。
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
复制代码
public static final String APPLICATION_EVENT_MULTICASTER_BEAN_NAME = "applicationEventMulticaster";
向ApplicationEventMulticaster注册ApplicationListner。
/** * Add beans that implement ApplicationListener as listeners. * Doesn't affect other listeners, which can be added without being beans. */
protected void registerListeners() {
// Register statically specified listeners first.
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let post-processors apply to them!
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// Publish early application events now that we finally have a multicaster...
Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
if (earlyEventsToProcess != null) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
复制代码
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {....}
主要执行了两个方法:
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
执行了InstantiationAwareBeanPostProcessor,这个接口是BeanPostProcessor的子类,接口文档提到为内部使用。Object beanInstance = doCreateBean(beanName, mbdToUse, args);
BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args)
主要作了如下工做:
Class<?> beanClass = resolveBeanClass(mbd, beanName);
根据beanName加载class;BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd)
;getInstantiationStrategy().instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner)
生成bean实例,InstantiationStrategy默认的实现为CglibSubclassingInstantiationStrategy;populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw)
根据BeanDefinition为BeanWrapper封装的bean代理对象设置属性值。设置的方式,是建立了BeanDefinitionValueResolver对象,并BeanDefinitionValueResolver.resolveValueIfNecessary实现。resolveValueIfNecessary执行了一系列判断和递归调用,将属性值填充。
Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd)
1 invokeAwareMethods : 执行 BeanNameAware, BeanClassLoaderAware , BeanFactoryAware
2 applyBeanPostProcessorsBeforeInitialization: 调用了全部BeanPostProcessor的postProcessBeforeInitialization方法。
3 invokeInitMethods:
4 applyBeanPostProcessorsAfterInitialization: 执行全部的 BeanPostProcessor 的 postProcessAfterInitialization方法。
注册Bean销毁事件。 protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd)
实现**Aware类的接口,用于获取到Spring环境中的各类信息或对象:
经常使用的有:
其余还有:
用于其余各类Spring上下文信息的获取。
使用:Bean类实现**Aware接口。
容器实例化任何其它bean以前读取配置元数据,并能够根据须要进行修改。
BeanFactoryPostProcessor只定义了一个方法:postProcessBeanFactory(ConfigurableListableBeanFactory)。
在全部bean的定义已经加载,可是尚未初始化bean的时候,Spring容器会调用此方法,并能够根据须要修改ConfigurableListableBeanFactory的内容,如如PropertySourcesPlaceholderConfigurer。
使用:Bean类实现BeanFactoryPostProcessor接口,或调用AbstractApplicationContext.addBeanFactoryPostProcessor添加。
接收ApplicationEventMulticaster广播的事件,事件是ApplicationEvent及其子类。
接收的是ApplicationEventPublisher发布的事件。
使用:Bean类实现ApplicationListener接口并实现其定义的方法onApplicationEvent(E event),或调用AbstractApplicaitonContext.addApplicationListener添加。
有两个方法,分别在InitializingBean先后执行,对bean对象进行处理。
注:不能返回null,不然程序将再也不往下进行。如不须要处理则返回原对象便可。
使用:Bean类实现BeanPostProcessor接口,或调用AbstractBeanFactory. addBeanPostProcessor添加。
在bean的各类属性设置完成后执行,用于执行自定义的初始化操做。
使用:Bean类实现InitializingBean接口。
在bean销毁以前执行,用于执行销毁前的操做。
使用:Bean类实现DisposableBean接口。