Spring注解(二)——————Bean的生命周期及BeanPostProcessor原理

关注微信公众号【行走在代码行的寻路人】获取Java相关资料,分享项目经验及知识干货。

以下测试的源码地址:https://github.com/877148107/Spring-Annotation

  • Bean的生命周期

   bean创建----初始化---销毁的过程

     1.创建

         bean对象创建,单实例:在容器启动的时候就创建对象;多实例:容器启动的时候不创建,每次获取的时候创建

     2.初始化

        对象创建完成并赋值后调用初始化方法

     3.销毁

        单实例:容器关闭后就销毁;多实例:容器关闭后不会销毁,容器不管理这个多实例bean

@Configuration
public class MyBeanLifeConfiguration {

    @Bean(initMethod = "init",destroyMethod = "destroy")
    public Car car(){
        return new Car();
    }
}


public class Car {

    public void car(){
        System.out.println("car 创建");
    }

    public void init(){
        System.out.println("car 初始化");
    }

    public void destroy(){
        System.out.println("car 销毁");
    }
}
  • Bean的初始化、销毁有四种方法进行

   1.通过上面自定义初始化、销毁方法,并在注解当中去配置

   2.通过实现初始化InitializingBean和销毁DisposableBean的接口

@Component
public class Cat implements InitializingBean, DisposableBean {

    public void cat(){
        System.out.println("cat 创建");
    }

    public void destroy() throws Exception {
        System.out.println("Cat destroy。。。。。。。。。");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("Cat afterPropertiesSet。。。。。。。。。。");
    }
}

   3.可以使用JSR250;@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法,@PreDestroy:在容器销毁bean之前通知我们进行清理工作

   4.通过实现接口【BeanPostProcessor】的方式

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {

    public Object postProcessBeforeInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessBeforeInitialization:"+o+"==>"+s);
        return o;
    }

    public Object postProcessAfterInitialization(Object o, String s) throws BeansException {
        System.out.println("postProcessAfterInitialization:"+o+"==>"+s);
        return o;
    }
}
  • 接口【BeanPostProcessor】的原理

Spring底层很多类实现了这个BeanPostProcessor后置处理器。很多注解功能都是通过这个接口实现的。

    第一步:创建容器AnnotationConfigApplicationContext

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MyBeanLifeConfiguration.class);

    第二步:初始化自定义后置处理器创建并初始化MyBeanPostProcessor

     当容器创建时回去扫描注解的组件bean添加到容器中,这里我们自己创建了一个自定义的后置处理器MyBeanPostProcessor

    第三步:doCreateBean(beanName, mbdToUse, args)创建Bean

    第四步:populateBean(beanName, mbd, instanceWrapper)对Bean进行赋值等操作

    第五步:initializeBean(beanName, exposedObject, mbd)初始化bean

    第六步:applyBeanPostProcessorsBeforeInitialization(bean, beanName)调用初始化bean之前的方法

    第七步:invokeInitMethods(beanName, wrappedBean, mbd)调用初始化bean方法

    第八步:applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)调用初始化bean之后的方法

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值