当前位置 博文首页 > 青春季风暴:spring源码分析(二)——bean的生命周期

    青春季风暴:spring源码分析(二)——bean的生命周期

    作者:[db:作者] 时间:2021-09-06 10:30

    spring源码分析(二)——spring bean的生命周期

    bean的生命周期分为三个阶段:bean创建—初始化----销毁的过程

    在bean创建之后,我们可以在bean的初始化和销毁的前后对bean做一些处理,加入我们自己的逻辑,以下四种方式可以让我们在bean初始化和销毁的时候执行逻辑:
    1)、指定初始化和销毁方法;通过@Bean指定init-method和destroy-method;
    2)、通过让Bean实现InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑);
    3)、可以使用JSR250;
    @PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
    @PreDestroy:在容器销毁bean之前通知我们进行清理工作
    4)、BeanPostProcessor【interface】:bean的后置处理器;
    在bean初始化前后进行一些处理工作;
    postProcessBeforeInitialization:在初始化之前工作
    postProcessAfterInitialization:在初始化之后工作

    自定义bean的初始化和销毁方法

    我们可以自定义初始化和销毁方法,使容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法。我们在实体类中定义初始化和销毁方法,可以加入自己的逻辑,然后创建对象的时候,通过注解@Bean(initMethod=“init”,destroyMethod=“detory”)来指明实体类中的初始化和销毁方法分别是哪个。

    @ComponentScan("com.example.bean")
    @Configuration
    public class MainConfigOfLifeCycle {
    	
    	//@Scope("prototype")
    	@Bean(initMethod="init",destroyMethod="detory")
    	public Car car(){
    		return new Car();
    	}
    
    }
    

    在实体类中定义初始化和销毁方法,可以加入自己的逻辑

    @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...");
    	}
    }
    

    创建对象、初始化以及销毁的时机

    对于创建单实例对象和创建多实例对象,初始化和销毁的时机是不同的
    单实例:在容器启动的时候创建对象
    多实例:在每次获取的时候创建对象
    单实例在容器启动的时候就创建,以后就不需再进行操作。
    对于多实例,为了避免资源浪费和性能,所以只在调用的时候才创建。

    调用顺序
    BeanPostProcessor.postProcessBeforeInitialization
    初始化:
    对象创建完成,并赋值好,调用初始化方法。。。

    BeanPostProcessor.postProcessAfterInitialization
    销毁:
    单实例:容器关闭的时候
    多实例:容器不会管理这个bean;容器不会调用销毁方法;

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

    让实体类继承InitializingBean,DisposableBean接口,并实现其方法即可

    @Component
    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...");
    	}
    
    }
    

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

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

    Spring底层对 BeanPostProcessor 的使用;
    bean赋值,注入其他组件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;

    使用JSR250

    实现ApplicationContextAware接口,并重写它的方法init和detory,并分别加上对应的注解

    
    @Component
    public class Dog implements ApplicationContextAware {
    	
    	//@Autowired
    	private ApplicationContext applicationContext;
    	
    	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...");
    	}
    	@Override
    	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    		// TODO Auto-generated method stub
    		this.applicationContext = applicationContext;
    	}
    }
    
    

    作者:青春季风暴
    来源:CSDN
    原文:https://blog.csdn.net/pzq915981048/article/details/83416621
    版权声明:本文为博主原创文章,转载请附上博文链接!

    cs
    下一篇:没有了