ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")调试收获

ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml")代码调试收获



1.通过super(parent)调用了父类AbstractApplicationContext的构造方法,使AbstractApplicationContext中

ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver;引发学习http://cainiaoboke.iteye.com/blog/2327685

2.setConfigLocations(configLocations)调用父类AbstractRefreshableConfigApplicationContext的setConfigLocations方法,使中的private String[] configLocations=[Beans.xml]

3.重点refresh开始调用AbstractApplicationContext的refresh()方法

public void refresh() throws BeansException, IllegalStateException {  
        synchronized (this.startupShutdownMonitor) {  
            // 容器启动的预先准备,记录容器启动的时间和标记  
            prepareRefresh();  
  
            // 创建BeanFactory,如果已有就销毁,没有就创建。此类实现了对BeanDefinition的装载  
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  
  
            // 配置BeanFactory标准上下文特性,如类装载器,PostProcesser等  
            prepareBeanFactory(beanFactory);  
  
            try {  
                // 在bean被装载后,提供一个修改BeanFactory的入口  
                postProcessBeanFactory(beanFactory);  
  
                // 调用postProcessBeanFactory  
                invokeBeanFactoryPostProcessors(beanFactory);  
  
                // 注册用于拦截bean创建过程中的BeanPostProcessors  
                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();  
  
                // 注册监听器  
                registerListeners();  
  
                // 完成容器的初始化,里面的preInstantiateSingletons()完成对单例对象的创建  
                finishBeanFactoryInitialization(beanFactory);  
  
                // Last step: publish corresponding event.  
                finishRefresh();  
            }  
  
            catch (BeansException ex) {  
                // Destroy already created singletons to avoid dangling resources.  
                beanFactory.destroySingletons();  
  
                // Reset 'active' flag.  
                cancelRefresh(ex);  
  
                // Propagate exception to caller.  
                throw ex;  
            }  
        }  
    }  
容器启动的预先准备,记录容器启动的时间和标记  初始化PropertySources校验需要的properties
protected void prepareRefresh() {
		this.startupDate = System.currentTimeMillis();

		synchronized (this.activeMonitor) {
			this.active = true;
		}

		if (logger.isInfoEnabled()) {
			logger.info("Refreshing " + this);
		}

		// Initialize any placeholder property sources in the context environment
		initPropertySources();

		// Validate that all properties marked as required are resolvable
		// see ConfigurablePropertyResolver#setRequiredProperties
		getEnvironment().validateRequiredProperties();
	}

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();   

1. 加载XML文件,封装成Resource对象

2. 调用Reader对象方法读取XML文件内容,并将相关属性放到BeanDefinition实例
3. 将BeanDefinition对象放到BeanFactory对象

对于默认的单例Bean在refresh中的

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

finishBeanFactoryInitialization(beanFactory); 中实例化

 对于非单例或延迟加载的Bean在refresh中的实例化在getbean方法时实例化

BeanPostProcessor的构造方法的调用都在refresh()中的

// Register bean processors that intercept bean creation.

registerBeanPostProcessors(beanFactory);

要点:

refresh()中initApplicationEventMulticaster();注册监听

registerBeanPostProcessors(beanFactory);注册BeanPostProcessor

这是BeanPostProcessor实现类构造器!!  BeanPostProcessor在这里创建实例

finishRefresh();发送事件给刚注册的监听

finishBeanFactoryInitialization(beanFactory);里面是创建对象 属性赋值等,如下:

Hello World构造函数被调用了

setMessage 被调用了

EnvironmentAware 被调用了

ApplicationContextAware 被调用了

bean处理器:bean创建之前..

InitializingBean afterPropertiesSet 被调用了

int-method 被调用了

bean处理器:bean创建之后..

ApplicationListener 被调用了 (创建容器)

ApplicationListener 被调用了  (销毁容器)

DisposableBean 被调用了

destroy-method 被调用了

 具体实现在AbstractAutowireCapableBeanFactory里



 populateBean(beanName, mbd, instanceWrapper);里面是属性赋值,依赖注入

 exposedObject = initializeBean(beanName, exposedObject, mbd);里面是:

EnvironmentAware 被调用了

ApplicationContextAware 被调用了

bean处理器:bean创建之前..

InitializingBean afterPropertiesSet 被调用了

int-method 被调用了

bean处理器:bean创建之后..

 exposedObject = initializeBean(beanName, exposedObject, mbd);中有段代码:

①if (mbd == null || !mbd.isSynthetic()) {

wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);

}

这个就是处理BeanPostProcessor的,Aware接口的实现了,是因为在refresh中

prepareBeanFactory(beanFactory);里面添加了一个beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

所以说常用的aware接口方式是:在BeanPostProcessor中默认都加了一个ApplicationContextAwareProcessor,而这个ApplicationContextAwareProcessor实现了BeanPostProcessor接口,所以在加载后置处理器时就处理aware相关的逻辑

invokeInitMethods(beanName, wrappedBean, mbd);

这个加载实现了先后加载InitializingBean 和有init-method方法

③wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

这个方法加载BeanPostProcessor的 postProcessAfterInitialization方法

 



 

package com.jhuc.test;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;

public class HelloWorld implements ApplicationContextAware,EnvironmentAware,InitializingBean,ApplicationListener,DisposableBean{
    private String message;
    public HelloWorld(){
        System.out.println("Hello World构造函数被调用了");
    }

    public void setMessage(String message){
        System.out.println("setMessage 被调用了");
        this.message  = message;
    }
 
    public String getMessage(){
        return this.message;
    }
 
    
    public void byebye(){
           System.out.println("int-method 被调用了");
    }

    @Override
    public void setEnvironment(Environment environment) {
        System.out.println("EnvironmentAware 被调用了");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("ApplicationContextAware 被调用了");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean afterPropertiesSet 被调用了");
    }

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        System.out.println("ApplicationListener 被调用了");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean 被调用了");
    }
    public void destroyMethod(){
        System.out.println("destroy-method 被调用了");
    }
}
package com.jhuc.test;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {
 
     public MyBeanPostProcessor() {
        super();
        System.out.println("这是BeanPostProcessor实现类构造器!!");        
     }
 
     @Override
     public Object postProcessAfterInitialization(Object bean, String arg1)
             throws BeansException {
         System.out.println("bean处理器:bean创建之后..");
         return bean;
     }
 
     @Override
     public Object postProcessBeforeInitialization(Object bean, String arg1)
             throws BeansException {
         System.out.println("bean处理器:bean创建之前..");
     
         return bean;
     }
 }

猜你喜欢

转载自cainiaoboke.iteye.com/blog/2327693