zoukankan      html  css  js  c++  java
  • 【spring 注解驱动开发】spring对象的生命周期

    尚学堂spring 注解驱动开发学习笔记之 - 生命周期

    生命周期

      1、生命周期-@Bean指定初始化和销毁方法
      2、生命周期-InitializingBean和DisposableBean
      3、生命周期-@PostConstruct&@PreDestroy
      4、生命周期-BeanPostProcessor-后置处理器
      5、生命周期-BeanPostProcessor原理
      6、生命周期-BeanPostProcessor在Spring底层的使用

      7、生命周期-总结

    1、生命周期-@Bean指定初始化和销毁方法

    配置时指定初始化及销毁方法:

    Bean中提供对应的初始化及销毁方法:

    package com.atguigu.bean;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Car {
    	
    	public Car(){
    		System.out.println("car constructor...");
    	}
    	
    	public void init(){
    		System.out.println("car ... init...");
    	}
    	
    	public void detory(){
    		System.out.println("car ... detory...");
    	}
    
    }

    2、生命周期-InitializingBean和DisposableBean

    通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑);

    package com.atguigu.bean;
    
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Cat implements InitializingBean,DisposableBean {
    	
    	public Cat(){
    		System.out.println("cat constructor...");
    	}
    
    	public void destroy() throws Exception {
    		// TODO Auto-generated method stub
    		
    	}
    
    	public void afterPropertiesSet() throws Exception {
    		// TODO Auto-generated method stub
    		
    	}
    }

    3、生命周期-@PostConstruct&@PreDestroy

    可以使用JSR250:

      @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法

      @PreDestroy:在容器销毁bean之前通知我们进行清理工作

    package com.atguigu.bean;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Dog{
    	
    	public Dog(){
    		System.out.println("dog constructor...");
    	}
    	
    	//对象创建并赋值之后调用
    	@PostConstruct
    	public void init(){
    		System.out.println("Dog....@PostConstruct...");
    	}
    	
    	//容器移除对象之前
    	@PreDestroy
    	public void detory(){
    		System.out.println("Dog....@PreDestroy...");
    	}
    }

    4、生命周期-BeanPostProcessor-后置处理器

    BeanPostProcessor【interface】:bean的后置处理器:

      在bean初始化前后进行一些处理工作;

      postProcessBeforeInitialization:在初始化之前工作

      postProcessAfterInitialization:在初始化之后工作

    package com.atguigu.bean;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    import org.springframework.stereotype.Component;
    
    /**
     * 后置处理器:初始化前后进行处理工作
     * 将后置处理器加入到容器中
     * @author lfy
     */
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
    	public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    		// TODO Auto-generated method stub
    		System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);
    		return bean;
    	}
    
    	public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    		// TODO Auto-generated method stub
    		System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
    		return bean;
    	}
    
    }

    5、生命周期-BeanPostProcessor原理

    5.1 调用链 

      1、AnnotationConfigApplicationContext --> AnnotationConfigApplicationContext(Class<?>... componentClasses)()方法的 -->  refresh()方法;
    
      2、AbstractApplicationContext类 --> refresh()方法的 --> finishBeanFactoryInitialization(beanFactory);方法
    
      3、AbstractApplicationContext类 --> finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory)方法的 --> beanFactory.preInstantiateSingletons();方法;
    
      4、DefaultListableBeanFactory类 --> preInstantiateSingletons()方法的 --> getBean(beanName);方法;
    
      5、AbstractBeanFactory类 --> getBean(String name)方法的 --> doGetBean(name, null, null, false);
    
      6、AbstractBeanFactory类 --> doGetBean(final String name, @Nullable final Class<T> requiredType,@Nullable final Object[] args, boolean typeCheckOnly)方法的 --> createBean(beanName, mbd, args); L320
    
      7、AbstractAutowireCapableBeanFactory类 --> createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)方法的 --> doCreateBean(beanName, mbdToUse, args);
    
      8、AbstractAutowireCapableBeanFactory类 --> doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)方法。目标执行方法
    

      

     

    5.2目标执行方法

      如下图所示:

        1、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);方法为对象初始化前的执行操作;

        2、exposedObject = initializeBean(beanName, exposedObject, mbd);方法为对象执行初始化操作;

        3、initializeBean(beanName, exposedObject, mbd); --> wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);方法为对象初始化后的操作。

     

    5.3 具体执行

    遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization

    6、生命周期-BeanPostProcessor在Spring底层的使用

      例:

        bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;

        所有实现了BeanPostProcessor接口的类或接口都有此功能。

    7、生命周期-总结

    /**
     * bean的生命周期:
     * 		bean创建---初始化----销毁的过程
     * 容器管理bean的生命周期;
     * 我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
     * 
     * 构造(对象创建)
     * 		单实例:在容器启动的时候创建对象
     * 		多实例:在每次获取的时候创建对象
     * 
     * BeanPostProcessor.postProcessBeforeInitialization
     * 初始化:
     * 		对象创建完成,并赋值好,调用初始化方法。。。
     * BeanPostProcessor.postProcessAfterInitialization
     * 销毁:
     * 		单实例:容器关闭的时候
     * 		多实例:容器不会管理这个bean;容器不会调用销毁方法;
     * 
     * 
     * 遍历得到容器中所有的BeanPostProcessor;挨个执行beforeInitialization,
     * 一但返回null,跳出for循环,不会执行后面的BeanPostProcessor.postProcessorsBeforeInitialization
     * 
     * BeanPostProcessor原理
     * populateBean(beanName, mbd, instanceWrapper);给bean进行属性赋值
     * initializeBean
     * {
     * applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
     * invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
     * applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
     *}
     * 
     * 
     * 
     * 1)、指定初始化和销毁方法;
     * 		通过@Bean指定init-method和destroy-method;
     * 2)、通过让Bean实现InitializingBean(定义初始化逻辑),
     * 				DisposableBean(定义销毁逻辑);
     * 3)、可以使用JSR250;
     * 		@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
     * 		@PreDestroy:在容器销毁bean之前通知我们进行清理工作
     * 4)、BeanPostProcessor【interface】:bean的后置处理器;
     * 		在bean初始化前后进行一些处理工作;
     * 		postProcessBeforeInitialization:在初始化之前工作
     * 		postProcessAfterInitialization:在初始化之后工作
     * 
     * Spring底层对 BeanPostProcessor 的使用;
     * 		bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;
     * 
     * @author lfy
     *
     */
  • 相关阅读:
    剑指 Offer 51. 数组中的逆序对
    剑指 Offer 68
    剑指 Offer 68
    JS绑定事件三种方式
    图片懒加载原理及实现
    资源加载过程
    了解JS单线程和任务队列!
    JS函数作用域提升
    JS函数种类详解
    ES6之模版字符串
  • 原文地址:https://www.cnblogs.com/wjqhuaxia/p/12255130.html
Copyright © 2011-2022 走看看