Bean生命周期(面试版)

一、bean生命周期基本流程

  1. 实例化
  2. 属性填充
  3. 初始化
  4. 销毁

二、流程细节

1、初始化方法和销毁方法

1)自定义式:

  • xml与@Bean方式一样
public class Book {
    public void init(){
        System.out.println("初始化方法");
    }
    public void destroy(){
        System.out.println("销毁方法");
    }
}
@Bean(initMethod = "init",destroyMethod = "destroy")
public Book book(){
    return new Book();
}

2) 接口式

  • InitializingBean(初始化接口)、DisposableBean(销毁接口)实现其方法即可
public interface InitializingBean {
	void afterPropertiesSet() throws Exception;
}
public interface DisposableBean {
	void destroy() throws Exception;
}

3)声明式

  • 添加注解 @PostConstruct(初始化)@PreDestroy(销毁)的方法
public class Book {
	@PostConstruct
    public void initMethod(){
        System.out.println("初始化方法");
    }
    @PreDestroy
    public void destroyMethod(){
        System.out.println("销毁方法");
    }
}

4)执行顺序

1、初始化销毁顺序:声明式—>接口式—>自定义式

2、单例:容器关闭时候销毁;多例:容器关闭不销毁

2、InstantiationAwareBeanPostProcessor实例化后置处理器

  • InstantiationAwareBeanPostProcessor接口是BeanPostProcessor的父接口
  • 在所有实例化前后执行
@Component
@Slf4j
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        log.debug("实例化后置处理器>>>>>>> 实例化之前执行, " +
        "这里返回的对象会替换掉原本的bean,直接返回,不进行后续bean生命周期");
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        log.debug("实例化后置处理器>>>>>>> 实例化之后执行, " +
        "这里如果返回 false 会跳过属性填充阶段");
        return true;
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        log.debug("实例化后置处理器>>>>>>> 属性填充阶段, " +
        "如 @Autowired、@Value、@Resource");
        return pvs;
    }
}

2、BeanPostProcessor初始化后置处理器

  • 在所有初始化方法前后执行
  • 可以定义多个后置处理器,一旦返回null,则跳过之后的处理器往下执行了
  • 可以返回bean,也可以返回bean的包装对象(aop动态代理)
@Component
@Slf4j
public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.debug("初始化后置处理器>>>>>>> 初始化之前执行, " +
        "这里返回的对象会替换掉原本的 bean, 如 @PostConstruct、@ConfigurationProperties");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        log.debug("初始化后置处理器>>>>>>>  初始化之后执行, " +
        "这里返回的对象会替换掉原本的 bean, 如代理增强");
        return bean;
    }
}

4、xxxAware接口

  • 属性填充后,初始化前执行
  • spring aware 目的为了让bean获取spring容器中的服务
    • BeanNameAware:获取容器中bean名称
    • BeanFactorAware:获取BeanFactory容器
    • ApplicationContextAware:获取应用上下文
@Component
public class BeanUtil implements ApplicationContextAware {
    private ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
    public Object getBean(String beanName){
        return context.getBean(beanName);
    }
}

三、 总结执行流程

  1. 实例化后置处理器-实例化前
  2. 实例化
  3. 实例化后置处理器-实例化后
  4. 属性填充(扫描@Autowired @Value @Resource 注解,完成自动注入)
  5. 处理Awar接口
  6. 初始化后置处理器-初始化前
  7. 三种方式初始化
  8. 初始化后置处理器-初始化后(会根据情况包装为代理类,即AOP)
  9. 销毁
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬天vs不冷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值