【Spring】注解驱动开发之bean的生命周期

Spring中bean的生命周期主要四个阶段:

  1. 实例化
  2. 属性赋值
  3. 初始化
  4. 销毁

实例化之前

继承org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter.postProcessBeforeInstantiation

一、实例化

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

实例化之后

继承org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter.postProcessAfterInstantiation

二、属性赋值

初始化前

实现org.springframework.beans.factory.config.BeanPostProcessor.postProcessBeforeInitialization

三、初始化

对象创建完成,并且赋值完成,调用初始化方法,指定初始化方法有如下几种方式

  1. 使用@Bean注解中的initMethod方法,等同于xml中bean标签的init-method属性
  2. 通过bean实现InitializingBean接口
  3. 使用JSR250(java规范)@PostConstruct注解,bean创建完成并且完成属性赋值,来执行初始化方法

初始化后

实现org.springframework.beans.factory.config.BeanPostProcessor.postProcessAfterInitialization

四、销毁

  1. 使用@Bean注解中的destroyMethod方法,等同于xml中bean标签的destroy-method属性
  2. 通过bean实现DisposableBean接口
  3. 使用JSR250(java规范)@PreDestroy注解,在容器移除bean之前.

注意:

单实例:容器关闭的会执行
多实例:容器关闭不会调用销毁方法

五、示例:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class CatLifeBean implements InitializingBean, DisposableBean {

    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("CatLifeBean setName...");
        this.name = name;
    }

    public void init(){
        System.out.println("CatLifeBean @Bean init...");
    }

    @PostConstruct
    public void init_A(){
        System.out.println("CatLifeBean @PostConstruct...");
    }

    public void destroy_A(){
        System.out.println("CatLifeBean @Bean destroy...");
    }

    @PreDestroy
    public void destroy_B(){
        System.out.println("CatLifeBean @PreDestroy...");
    }

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

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

 

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
import org.springframework.stereotype.Component;

@Component
public class MyInstantiationAwareBeanPostProcessorAdapter extends InstantiationAwareBeanPostProcessorAdapter {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        System.out.println(beanName+"在实例化之前...");
        return super.postProcessBeforeInstantiation(beanClass,beanName);
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"在实例化之后...");
        return super.postProcessAfterInstantiation(bean,beanName);
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        System.out.println(beanName+"属性赋值中...");
        return super.postProcessProperties(pvs,bean,beanName);
    }
}
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;

@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor beanName " + beanName + "bean-->" + "postProcessBeforeInitialization ...");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor beanName " + beanName + "bean-->" + "postProcessAfterInitialization ...");
        return bean;
    }
}
import com.model.CatLifeBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(value = "com.model")
public class CatLifeConfig {

    @Bean(initMethod = "init",destroyMethod = "destroy_A")
    public CatLifeBean catLifeBean(){
        CatLifeBean catLifeBean = new CatLifeBean();
        catLifeBean.setName("张三");
        return catLifeBean;
    }
}

测试结果:

10:51:54.433 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'catLifeBean'
catLifeBean在实例化之前...
CatLifeBean 创建...
CatLifeBean setName...
catLifeBean在实例化之后...
catLifeBean属性赋值中...
BeanPostProcessor beanName catLifeBeanbean-->postProcessBeforeInitialization ...
CatLifeBean @PostConstruct...
CatLifeBean InitializingBean afterPropertiesSet...
CatLifeBean @Bean init...
BeanPostProcessor beanName catLifeBeanbean-->postProcessAfterInitialization ...
10:51:54.491 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6e8dacdf, started on Mon Aug 15 10:51:54 CST 2022
CatLifeBean @PreDestroy...
CatLifeBean DisposableBean destroy...
CatLifeBean @Bean destroy...

六、Spring底层对BeanPostProcessor的使用

  1. 注解@Async,通过org.springframework.scheduling.annotation.AsyncAnnotationBeanPostProcessor处理异步方法
  2. org.springframework.validation.beanvalidation.MethodValidationPostProcessor
  3. 注入IOC容器,bean实现ApplicationContextAware、EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware接口,通过org.springframework.context.support.ApplicationContextAwareProcessor实现
  4. 数据校验,通过org.springframework.validation.beanvalidation.BeanValidationPostProcessor实现
  5. 处理@PostConstruct和@PreDestroy注解,通过org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor实现
  6. 注解@Autowired,通过org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor实现
  7. 注入其他组件,等等.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值