SpringBean的全生命周期

SpringBean完整生命周期我们先执行一个测试,然后在分析源码

/**
 * Bean 全生命周期
 */
@Component
public class JxdSpringBean implements BeanNameAware, BeanFactoryAware,InitializingBean,DisposableBean, ApplicationContextAware {

    public JxdSpringBean(){
        System.out.println("1.JxdSpringBean 初始化 构造方法 ");
    }
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.setBeanFactory "+beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("2.setBeanName "+name);
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("8.JxdSpringBean destroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("6.JxdSpringBean afterPropertiesSet");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("4.JxdSpringBean ApplicationContext");
    }
}

 

@Component
public class JxdPostProcessors implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//        if(bean instanceof User)
        System.out.println("5.postProcessBeforeInitialization "+beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//        if(bean instanceof User)
        System.out.println("7.postProcessAfterInitialization "+beanName);
        return bean;
    }

}
@Configuration
@Import(JxdSpringBean.class)
public class JxdSpringConfig {

}

测试类:

public class test {
    private static AnnotationConfigApplicationContext applicationContext=new AnnotationConfigApplicationContext(JxdSpringConfig.class);
    public static void main(String[] args) {
        JxdSpringBean jxdSpringBean =applicationContext.getBean("jxdSpringBean", JxdSpringBean.class);
    }
}

我们看下控制台打印的情况,红框部分就是springBean生命全周期

 

源码时刻:

AbstractAutowireCapableBeanFactory 中 有一个方法
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
   if (System.getSecurityManager() != null) {
      AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
         invokeAwareMethods(beanName, bean);
         return null;
      }, getAccessControlContext());
   }
   else {
      invokeAwareMethods(beanName, bean); //检查Aware方法 实现的接口对应BeanNameAware, BeanFactoryAware   }
   //代码到这里已经执行了 bean的 构造方法
   Object wrappedBean = bean;
   if (mbd == null || !mbd.isSynthetic()) {
      /**
      *实现接口BeanPostProcessor,ApplicationContextAware, ApplicationContextAwareProcessor实现      
      *implements BeanPostProcessor 所以applyBeanPostProcessorsBeforeInitialization方法 会执行postProcessBeforeInitialization 从而会执行     
      *setApplicationContext     
      *      
      */
      wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); 
   }

   try {
      invokeInitMethods(beanName, wrappedBean, mbd); //bean的初始化 方法 实现的接口对应InitializingBean
   }
   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);//对应BeanPostProcessor中的postProcessAfterInitialization方法
   }

   return wrappedBean;
}

 

 

我们看一下中间经过的方法:

1.refresh() 

2. finishBeanFactoryInitialization(beanFactory);

3. beanFactory.preInstantiateSingletons();//初始化非懒加载的Bean

4.getBean(不是factoryBean 走else getBean ) -> doGetBean(第一次初始化getSigletion 等于null且是单例的 isSigletion  所以走createBean) ->createBean->doCreateBean;

5.populateBean(beanName, mbd, instanceWrapper);//(Bean 的参数赋值set方法)

6.exposedObject = initializeBean(beanName, exposedObject, mbd);// 初始化Bean 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值