多图详解Spring框架

  DefaultListableBeanFactory类继承关系

物联网

  图10.DefaultListableBeanFactory类继承关系图

  从这个图中发现除了BeanFactory相关的类外,还发现了与Bean的register相关。这在refreshBeanFactory方法中有一行loadBeanDefinitions(beanFactory)将找到答案,这个方法将开始加载、解析 Bean的定义,也就是把用户定义的数据结构转化为Ioc容器中的特定数据结构。

  这个过程可以用下面时序图解释:

物联网

  图11.创建BeanFactory时序图

  Bean的解析和登记流程时序图如下:

物联网

  图12.解析和登记Bean对象时序图

  创建好BeanFactory后,接下去添加一些Spring本身需要的一些工具类,这个操作在AbstractApplicationContext的prepareBeanFactory方法完成。

  AbstractApplicationContext中接下来的三行代码对Spring的功能扩展性起了至关重要的作用。前两行主要是让你现在可以对已经构建的BeanFactory的配置做修改,后面一行就是让你可以对以后再 创建Bean的实例对象时添加一些自定义的操作。所以他们都是扩展了Spring的功能,所以我们要学习使用Spring必须对这一部分搞清楚。

  其中在invokeBeanFactoryPostProcessors方法中主要是获取实现BeanFactoryPostProcessor接口的子类。并执行它的postProcessBeanFactory方法,这个方法的声明如下:

  清单3.BeanFactoryPostProcessor.postProcessBeanFactory

  void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)

  throws BeansException;

  它的参数是beanFactory,说明可以对beanFactory做修改,这里注意这个beanFactory是ConfigurableListableBeanFactory类型的,这也印证了前面介绍的不同BeanFactory所使用的场合不同,这里 只能是可配置的BeanFactory,防止一些数据被用户随意修改。

  registerBeanPostProcessors方法也是可以获取用户定义的实现了BeanPostProcessor接口的子类,并执行把它们注册到BeanFactory对象中的beanPostProcessors变量中。BeanPostProcessor中声明 了两个方法:postProcessBeforeInitialization、postProcessAfterInitialization分别用于在Bean对象初始化时执行。可以执行用户自定义的操作。

  后面的几行代码是初始化监听事件和对系统的其他监听者的注册,监听者必须是ApplicationListener的子类。

  如何创建Bean实例并构建Bean的关系网

  下面就是Bean的实例化代码,是从finishBeanFactoryInitialization方法开始的。

  清单4.AbstractApplicationContext.finishBeanFactoryInitialization

  protected void finishBeanFactoryInitialization(

  ConfigurableListableBeanFactory beanFactory) {

  // Stop using the temporary ClassLoader for type matching.

  beanFactory.setTempClassLoader(null);

  // Allow for caching all bean definition metadata, not expecting further changes .

  beanFactory.freezeConfiguration();

  // Instantiate all remaining (non-lazy-init) singletons.

  beanFactory.preInstantiateSingletons();

  }

  从上面代码中可以发现Bean的实例化是在BeanFactory中发生的。preInstantiateSingletons方法的代码如下:

  清单5.DefaultListableBeanFactory.preInstantiateSingletons

  public void preInstantiateSingletons() throws BeansException {

  if (this.logger.isInfoEnabled()) {

  this.logger.info("Pre- instantiating singletons in " + this);

  }

  synchronized (this.beanDefinitionMap) {

  for (String beanName : this.beanDefinitionNames) {

  RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

  if (!bd.isAbstract() && bd.isSingleton()

  && !bd.isLazyInit()) {

  if (isFactoryBean(beanName)) {

  final FactoryBean factory =

  (FactoryBean) getBean(FACTORY_BEAN_PREFIX+ beanName);

  boolean isEagerInit;

  if (System.getSecurityManager() != null

  && ;factory instanceof SmartFactoryBean) {

  isEagerInit = AccessController.doPrivileged(

  &nb sp; new PrivilegedAction() {

  &nb sp; public Boolean run() {

  return ((SmartFactoryBean) factory).isEagerInit();