Spring启动和Bean建立过程当中的可扩展接口

1.前言

Spring中有一些能够扩展的接口,能够用来在工做中更深度的使用Spring,这些接口大多分布在AbstractApplicationContext.refresh() 和 AbstractAutowireCapableBeanFactory.createBean()这两个方法的执行过程当中。java

2.AbstractApplicationContext.refresh()

2.1 refresh()简介

AbstractApplicationContext.refresh()是Spring环境启动 过程当中的一个重要方法,此方法中实例化了全部的bean,任何ApplicationContext的实现,都须要调用此方法spring

如上图所示,Spring中,全部的ApplicationContext,都继承于AbstractApplicationContext。

为节省篇幅,仅将要分析的几个方法代码片断抽取出来,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();
复制代码

2.2 prepareRefresh()

调用了initPropertySources,初始化资源,如属性文件中的占位符等。 由子类实现,如AbstractRefreshableWebApplicationContext。post

2.3 obtainFreshBeanFactory()

获取ConfigurableListableBeanFactory:this

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
	refreshBeanFactory();
	ConfigurableListableBeanFactory beanFactory = getBeanFactory();
	if (logger.isDebugEnabled()) {
		logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
	}
	return beanFactory;
}
复制代码

此方法中主要执行两部分流程:spa

2.3.1 调用refreshBeanFactory()

调用抽象方法refreshBeanFactory(),由子类AbstractRefreshableApplicationContext实现,代码片断以下:debug

DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
loadBeanDefinitions(beanFactory);  //读取xml,注册BeanDefinition。
复制代码

loadBeanDefinitions是AbstractRefreshableApplicationContext的一个抽象方法,由其子类AbstractXmlApplicationContext实现 ,详细了解AbstractXmlApplicationContext可参考Spring自定义配置的源码解析与实现3d

2.3.2 调用getBeanFactory()

调用抽象方法getBeanFactory(),由子类AbstractRefreshableApplicationContext实现,返回一个接口ConfigurableListableBeanFactory的实现类DefaultListableBeanFactory的实例。代理

这个DefaultListableBeanFactory实例,由上面的refreshBeanFactory()中调用createBeanFactory()建立。code

2.4 prepareBeanFactory

配置ConfigurableListableBeanFactory。

ConfigurableListableBeanFactory继承了BeanFactory,实现类是DefaultListableBeanFactory。

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory){....}

2.4.1 设置classLoader:

beanFactory.setBeanClassLoader(getClassLoader());

经过org.springframework.util.ClassUtils.getDefaultClassLoader()获取ClassLoader。

2.4.2 建立ApplicationContextAwareProcessor

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接口。

2.4.3 设置默认的上下文bean

注册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";
复制代码

2.5 invokeBeanFactoryPostProcessors

调用全部的 BeanFactoryPostProcessor.postProcessBeanFactory。 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());

public static void invokeBeanFactoryPostProcessors( ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors){....}
复制代码

2.6 registerBeanPostProcessors

注册全部的BeanPostProcessor

protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
		PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
	}
复制代码

2.7 initApplicationEventMulticaster

初始化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";

2.8 registerListeners

向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);
			}
		}
	}
复制代码

3 AbstractAutowireCapableBeanFactory.createBean()

3.1 DefaultListableBeanFactory

如上图所示, DefaultListableBeanFactory是ListableBeanFactory和BeanDefinitionRegistry的默认实现,是全部BeanFactory的始祖。最终建立bean的,是它的直接父类AbstractAutowireCapableBeanFactory.createBean 。

3.2 createBean

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {....}

主要执行了两个方法:

  • Object bean = resolveBeforeInstantiation(beanName, mbdToUse); 执行了InstantiationAwareBeanPostProcessor,这个接口是BeanPostProcessor的子类,接口文档提到为内部使用。
  • Object beanInstance = doCreateBean(beanName, mbdToUse, args);

3.3 AbstractAutowireCapableBeanFactory.doCreateBean

3.3.1 createBeanInstance

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;
  • 使用BeanWrapper的实现类BeanWrapperImpl封装上面实例化的对象;
  • 使用initBeanWrapper(BeanWrapper bw)处理后返回。

3.3.2 populateBean

populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) 根据BeanDefinition为BeanWrapper封装的bean代理对象设置属性值。设置的方式,是建立了BeanDefinitionValueResolver对象,并BeanDefinitionValueResolver.resolveValueIfNecessary实现。resolveValueIfNecessary执行了一系列判断和递归调用,将属性值填充。

3.3.3 initializeBean

Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd)

  • 1 invokeAwareMethods : 执行 BeanNameAware, BeanClassLoaderAware , BeanFactoryAware

  • 2 applyBeanPostProcessorsBeforeInitialization: 调用了全部BeanPostProcessor的postProcessBeforeInitialization方法。

  • 3 invokeInitMethods:

    • 1)执行 InitializingBean.afterPropertiesSet
    • 2)执行 init-method;
  • 4 applyBeanPostProcessorsAfterInitialization: 执行全部的 BeanPostProcessor 的 postProcessAfterInitialization方法。

3.3.4 registerDisposableBeanIfNecessary

注册Bean销毁事件。 protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd)

  • 1 执行 DisposableBean.destroy();
  • 2 执行destroy-method;

4 总结

4.1 **Aware

实现**Aware类的接口,用于获取到Spring环境中的各类信息或对象:

经常使用的有:

  • ApplicationContextAware:获取当前的ApplicationContext;
  • BeanNameAware:获取当前的beanName;
  • BeanClassLoaderAware:获取当前的ClassLoader;
  • BeanFactoryAware:获取当前的BeanFactory;
  • ApplicationEventPublisherAware:获取当前的ApplicationEventPublisher,用于发布事件;要接收事件的类能够实现ApplicationListener接口,并实现其中的onApplicationEvent方法。

其余还有:

  • EnvironmentAware
  • EmbeddedValueResolverAware
  • ResourceLoaderAware
  • MessageSourceAware

用于其余各类Spring上下文信息的获取。

使用:Bean类实现**Aware接口。

4.2 BeanFactoryPostProcessor

容器实例化任何其它bean以前读取配置元数据,并能够根据须要进行修改。

BeanFactoryPostProcessor只定义了一个方法:postProcessBeanFactory(ConfigurableListableBeanFactory)

在全部bean的定义已经加载,可是尚未初始化bean的时候,Spring容器会调用此方法,并能够根据须要修改ConfigurableListableBeanFactory的内容,如如PropertySourcesPlaceholderConfigurer。

使用:Bean类实现BeanFactoryPostProcessor接口,或调用AbstractApplicationContext.addBeanFactoryPostProcessor添加。

4.3 ApplicationListener

接收ApplicationEventMulticaster广播的事件,事件是ApplicationEvent及其子类。

接收的是ApplicationEventPublisher发布的事件。

使用:Bean类实现ApplicationListener接口并实现其定义的方法onApplicationEvent(E event),或调用AbstractApplicaitonContext.addApplicationListener添加。

4.4 BeanPostProcessor

有两个方法,分别在InitializingBean先后执行,对bean对象进行处理。

  • postProcessBeforeInitialization :在InitializingBean和init-method前执行;
  • postProcessAfterInitialization:在InitializingBean和init-method后执行;

注:不能返回null,不然程序将再也不往下进行。如不须要处理则返回原对象便可。

使用:Bean类实现BeanPostProcessor接口,或调用AbstractBeanFactory. addBeanPostProcessor添加。

4.5 InitializingBean

在bean的各类属性设置完成后执行,用于执行自定义的初始化操做。

  • 执行 InitializingBean.afterPropertiesSet;
  • 在init-method以前执行;

使用:Bean类实现InitializingBean接口。

4.6 DisposableBean

在bean销毁以前执行,用于执行销毁前的操做。

  • 执行 DisposableBean.destroy();
  • 在destroy-method以前执行;

使用:Bean类实现DisposableBean接口。

相关文章
相关标签/搜索