• spring注解-bean生命周期


    bean的生命周期

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

    容器管理bean的生命周期

    • 对象创建:容器启动后调用bean的无参构造函数创建bean
      • 单实例:在容器启动的时候创建对象
      • 多实例:在每次获取的时候创建对象
    • 初始化:对象创建完成后调用初始方法(BeanPostProcessor可以对bean初始化前后进行拦截处理)
    • 销毁:容器关闭
      • 单实例:容器关闭的时候进行销毁
      • 多实例:容器不会管理这个bean(不会自动调用销毁方法),需要我们自己手工调用相应方法进行销毁

     

    自定义初始和销毁方法

    通过@Bean指定init-method和destroy-method

      容器在bean进行到某个生命周期的时候来调用组件中我们自定义的任意方法(都可作为初始和销毁方法)

    //@Scope("prototype")
    @Bean(initMethod="init",destroyMethod="detory")
    public Car car(){
      return new Car();
    }
    
    //以往在xml定义初始和销毁方法
    <bean id="person" class="com.bean.Person"  scope="prototype" init-method="" destroy-method=""></bean>

    通过让Bean实现InitializingBean、DisposableBean接口的方法

      用@Bean将组件注册到容器里;省略。。。

    public class Cat implements InitializingBean,DisposableBean {
        
        public Cat(){
            System.out.println("cat constructor...");
        }
    
        @Override
        public void destroy() throws Exception {
            // TODO Auto-generated method stub
            System.out.println("cat...destroy...");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            // TODO Auto-generated method stub
            System.out.println("cat...afterPropertiesSet...");
        }

    使用JSR250

        //在bean创建完成并且属性赋值完成后来执行初始化方法
    @PostConstruct
    public void init(){
    System.out.println("Dog....@PostConstruct...");
    }
    //在容器销毁bean之前
       @PreDestroy
       public void detory(){
    System.out.println("Dog....@PreDestroy...");
    }

     

    实现BeanPostProcessor接口

      bean的后置处理器,在(所有)bean初始化前后进行一些处理工作;用@Bean将组件注册到容器里;省略。。。

      • postProcessBeforeInitialization:在初始化之前工作
      • postProcessAfterInitialization:在初始化之后工作
      public class MyBeanPostProcessor implements BeanPostProcessor {
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            // TODO Auto-generated method stub
            System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
            return bean;
        }
    
    }

     BeanPostProcessor原理

    populateBean(beanName, mbd, instanceWrapper);//给bean进行属性赋值
    initializeBean
    {
        applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
        invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
        applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    Spring底层对 BeanPostProcessor 的使用

      查看所有实现了BeanPostProcessor接口的实现类,发现bean赋值、@Import(注入其他组件)、@Autowired、@PostConstruct(生命周期注解)、@Async都是通过大量的XXXBeanPostProcessor实现的。也就是说这些功能在bean创建完成后,beanPostProcessor在它们初始化前后进行了一系列处理工作,比如在某个bean中需要ioc容器的操作:

    //实现ApplicationContextAware接口,ioc容器会自动在dog创建完成后执行setApplicationContext进行赋值;
    而之所以会这么做是因为有个ApplicationContextAwareProcessor,它会对所有实现了

    ApplicationContextAware的bean进行赋值操作
    public class Dog implements ApplicationContextAware
    
    
      @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            // TODO Auto-generated method stub
            this.applicationContext = applicationContext;
        }

     

     

     

  • 相关阅读:
    GitHub超详细图文攻略
    HTML5本地存储——IndexedDB二:索引
    HTML5 indexedDb 数据库
    js 对象 浅拷贝 和 深拷贝
    《黑客大曝光》实践部分——sql注入(7/8)
    Linux内核设计第五周——扒开系统调用三层皮(下)
    读书笔记——《黑客大曝光》(6/8)
    《linux内核设计与实现》读书笔记第五章——系统调用
    Linux内核设计第四周——扒开系统调用三层皮
    《linux内核设计与实现》读书笔记第一、二章
  • 原文地址:https://www.cnblogs.com/edda/p/13447901.html
Copyright © 2020-2023  润新知