先看自己总结用debug调试的过程总结
创建ioc容器 ---> ioc容器的构造器会调用refresh方法刷新容器 ---> 到refresh方法里面初始化所有单实例对象
---> 然后到初始化方法,初始化方法先获取,获取不到的话容器中创建 ---> 然后到创建对象,先为属性赋好值,然后再调用后置处理器
注意: 当后置处理器那两个方法的一旦返回值是null,后面的后置处理器的方法就不执行了
下面是我debug的详细过程,记录下心得体会
源码debug的过程
//创建ioc容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);
//ioc容器的构造器方法调用中的refesh方法来刷新容器
public AnnotationConfigApplicationContext(Class>... annotatedClasses) {
this();
register(annotatedClasses);
refresh();//刷新容器
}
//refresh方法调用finishBeanFactoryInitialization,传入bean工厂,初始化所有单实例对象(使用了单例模式)
finishBeanFactoryInitialization(beanFactory);
//然后就是使用bean工厂来初始化所有的单实例bean,这里bean工厂就是生成bean的(工厂模式!)
beanFactory.preInstantiateSingletons();
//它先尝试获取bean对象,发现没有
getBean(beanName); return doGetBean(name,null,null,false);
//获取单实例
sharedInstance = getSingleton(beanName, new ObjectFactory
//没找到就创建对象了
return createBean(beanName,mbd,args); Object beanInstance = doCreateBean(beanName, mbdToUse, args);
//调用到后置处理器了
try {
populateBean(beanName, mbd, instanceWrapper);//为bean的这些属性赋值
if (exposedObject != null) {
exposedObject = initializeBean(beanName, exposedObject, mbd);//然后才调用到后置处理器
}
}
看具体initializeBean的后置处理器方法
protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged(new PrivilegedAction
都已经到这了,继续深挖,看applyBeanPostProcessorsBeforeInitialization源码
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
//发现是挨个遍历bean方法,拿到beanProcessor执行对应bean1的postProcessBeforeInitialization
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
//如果返回null,就是后置处理器返回null,就不会遍历bean了,直接结束后置处理器对应的postProcessBeforeInitialization的方法
if (result == null) {
return result;
}
}
return result;
}
暑期编程PK赛
得CSDN机械键盘等精美礼品!


