Spring 源码 之 配置文件中的Bean在Spring中的创建过程

小编的这篇博客的主要目的:是为梳理Spring底层源码是如果创建XML配置Bean的流程,本篇博客凸显了单一职责仅是列出了创建配置Bean过程中涉及到的主要类和方法,至于类的功能和方法细节还请博友查看小编后续的文章或者去网上搜索相关的资料,如果有不对的地方,还请大神帮忙指出,以供参考学习:

1. web.context.ContextLoaderListener类

   项目启动后,web.xml配置文件会监听类org.springframework.web.context.ContextLoaderListener,并调用void                   contextInitialized(ServletContextEventevent)方法,开始自动始初始化Spring上下文WebApplicationContext。

public void contextInitialized(ServletContextEvent event)
{
   initWebApplicationContext(event.getServletContext());
}
2.springframwork.web.context. ContextLoader类(ContextLoaderListener的父类);

   调用该类的WebApplicationContextinitWebApplicationContext(ServletContext servletContext)方法 --->接着调用该类      的         void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac,ServletContext    sc)方法;

 public WebApplicationContext initWebApplicationContext(ServletContext servletContext)
 
       ...(略)
      if ((this.context instanceof ConfigurableWebApplicationContext)) {
        ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext)this.context;
        if (!cwac.isActive())
        {
 
          if (cwac.getParent() == null)
         {

            ApplicationContext parent = loadParentContext(servletContext);
           cwac.setParent(parent);
          }
          configureAndRefreshWebApplicationContext(cwac, servletContext);
         }
       }
      servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context);
                 
                ...(略)
 }

3.  springframwork.context.support. AbstractApplicationContext类;

调用该类的void refresh()方法 ---> 接着调用该类的registerBeanPostProcessors(beanFactory)方法;

public void refresh() throws BeansException, IllegalStateException
   ...(略)
   postProcessBeanFactory(beanFactory);

   invokeBeanFactoryPostProcessors(beanFactory);

   registerBeanPostProcessors(beanFactory);

   initMessageSource();
   
   
 ...(略)
}
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory)
{
   PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}

4.  springframwork.context.support. PostProcessorRegistrationDelegate类(其没有继承任何类);

调用该类的registerBeanPostProcessors(ConfigurableListableBeanFactorybeanFactory, AbstractApplicationContext applicationContext)方法;

public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext)

     String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

     ...(略)
     List<String> nonOrderedPostProcessorNames = new ArrayList();
     for (String ppName : postProcessorNames) {
        if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
            BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
            priorityOrderedPostProcessors.add(pp);
            if ((pp instanceof MergedBeanDefinitionPostProcessor)) {
                internalPostProcessors.add(pp);

                ...(略)
         }
      }
}
5.  springframwork.beans.factory.support. AbstractBeanFactory类;

在执行第4步的方法是,调用了ConfigurableListableBeanFactorybeanFactory的方法<T> T getBean(String name,Class<T> requiredType)方法(有必要在这里解释一下这个方法:此方法在ConfigurableListableBeanFactory接口中并没有定义,而是在顶层的BeanFactory接口定义的,ConfigurableListableBeanFactory接口自然可以继承此接口的定义,而在实现ConfigurableListableBeanFactory接口的抽象类AbstractBeanFactory中实现了此接口。此方法的返回值向上转型为BeanPostProcessor类(看第4部代码共色部分),此处待解释

public <T> T getBean(String name, Class<T> requiredType) throws BeansException

   return doGetBean(name, requiredType, null, false);
}

---> 接着调用该类的<T> T doGetBean(String name, Class<T> requiredType,final Object[] args, boolean typeCheckOnly)方法;

protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly)
{

   ...(略)
   else
        {
          String scopeName = mbd.getScope();
          Scope scope = (Scope)this.scopes.get(scopeName);
            if (scope == null) {
              throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
            }
            try {
              Object scopedInstance = scope.get(beanName, new ObjectFactory()
              {
                public Object getObject() throws BeansException {
                   AbstractBeanFactory.this.beforePrototypeCreation(beanName);
                   try {
                      return AbstractBeanFactory.this.createBean(beanName, mbd, args);
                   }
                   finally {
                   AbstractBeanFactory.this.afterPrototypeCreation(beanName);
                   }
                }
           });
          ...(略)
            
     return bean;
}
6.  springframwork.beans.factory.support. AbstractAutowireCapableBeanFactory类

调用该类的createBean(String beanName,RootBeanDefinition mbd, Object[] args)方法 

protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args)
{   
    ...(略)
    Object beanInstance = doCreateBean(beanName, mbdToUse, args);
    if (this.logger.isDebugEnabled()) {
        this.logger.debug("Finished creating instance of bean '" + beanName + "'");
    }
  return beanInstance;
}

---> 接着调用该类的Object doCreateBean(final String beanName, final RootBeanDefinitionmbd, Object[] args)方法

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args)throws BeanCreationException
{ 

     ...(略)
     Object exposedObject = bean;
     try {
       populateBean(beanName, mbd, instanceWrapper);
       if (exposedObject != null) {
         exposedObject = initializeBean(beanName, exposedObject, mbd);
       }
     }
               ...(略)
     
     return exposedObject;
}

  ---> 接着调用该类的Object initializeBean(final String beanName, final Object bean, RootBeanDefinitionmbd)方法

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

     ...(略)
     Object wrappedBean = bean;
     if ((mbd == null) || (!mbd.isSynthetic())) {
       wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
     }
     try
     {
       invokeInitMethods(beanName, wrappedBean, mbd);
     }
     catch (Throwable ex)
     {
       throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", ex);
     }
     
     if ((mbd == null) || (!mbd.isSynthetic())) {
       wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
     }
     return wrappedBean;
   }
}


  ---> 接着调用该类的Object applyBeanPostProcessorsBeforeInitialization(ObjectexistingBean, String beanName)方法(初始化Bean前

public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException
{
     Object result = existingBean;
     for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
       result = beanProcessor.postProcessBeforeInitialization(result, beanName); 完全初始化Bean前的操作
       if (result == null) {
         return result;
       }
     }
     return result;
}

---> 接着调用该类的invokeInitMethods(String beanName, final Object bean,RootBeanDefinition mbd)方法(初始化Bean)

protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd) throws Throwable
{
        ...(略)
       if (System.getSecurityManager() != null) {
         try {
           AccessController.doPrivileged(new PrivilegedExceptionAction()
           {
             public Object run() throws Exception {
               ((InitializingBean)bean).afterPropertiesSet();
               return null;
             }
           }, getAccessControlContext());
         }
         catch (PrivilegedActionException pae) {
           throw pae.getException();
         }
         
       } else {
         ((InitializingBean)bean).afterPropertiesSet();
       }
     }
     
    if (mbd != null) {
       String initMethodName = mbd.getInitMethodName();
       if ((initMethodName != null) && ((!isInitializingBean) || (!"afterPropertiesSet".equals(initMethodName))) && 
         (!mbd.isExternallyManagedInitMethod(initMethodName))) {
         invokeCustomInitMethod(beanName, bean, mbd);  完全初始化Bean的操作

       }
     }
}

---> 接着调用该类的Object applyBeanPostProcessorsAfterInitialization(ObjectexistingBean, String beanName) (初始化Bean后

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException
{
     Object result = existingBean;
     for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
       result = beanProcessor.postProcessAfterInitialization(result, beanName); // 完全初始化Bean后的操作
       if (result == null) {
         return result;
       }
     }
     return result;
}

返回Object wrappedBean类型的对象(实际上是已经包装好的Bean,即初始化完成的Bean)。

至此,Spring初始化XML配置文件中配置的Bean已经完成。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值