栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

浅谈Spring的Bean生命周期中的后置处理器的源码

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈Spring的Bean生命周期中的后置处理器的源码

先看自己总结用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() {
 singleton Object = singletonFactory.getObject();
 

//没找到就创建对象了

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() {
         @Override
         public Object run() {
            invokeAwareMethods(beanName, bean);
            return null;
         }
      }, getAccessControlContext());
   }
   else {
      invokeAwareMethods(beanName, bean);
   }

   Object wrappedBean = bean;
   if (mbd == null || !mbd.isSynthetic()) {
      wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);//后置处理器
   }

   try {
      invokeInitMethods(beanName, wrappedBean, mbd);//初始化方法就是前面的初始化init呀
   }
   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;
}
 

都已经到这了,继续深挖,看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机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号