您现在的位置是:首页 > 编程 > 

Bean生命周期(面试版)

2025-07-21 00:33:35
Bean生命周期(面试版) 一、bean生命周期基本流程实例化属性填充初始化销毁二、流程细节1、初始化方法和销毁方法1)自定义式:xml与@Bean方式一样代码语言:javascript代码运行次数:0运行复制public class Book { public void init(){ System.out.println("初始化方法");

Bean生命周期(面试版)

一、bean生命周期基本流程
  1. 实例化
  2. 属性填充
  3. 初始化
  4. 销毁
二、流程细节

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

1)自定义式:
  • xml与@Bean方式一样
代码语言:javascript代码运行次数:0运行复制
public class Book {
    public void init(){
        println("初始化方法");
    }
    public void destroy(){
        println("销毁方法");
    }
}
代码语言:javascript代码运行次数:0运行复制
@Bean(initMethod = "init",destroyMethod = "destroy")
public Book book(){
    return new Book();
}
2) 接口式
  • InitializingBean(初始化接口)、DisposableBean(销毁接口)实现其方法即可
代码语言:javascript代码运行次数:0运行复制
public interface InitializingBean {
	void afterPropertiesSet() throws Exception;
}
代码语言:javascript代码运行次数:0运行复制
public interface DisposableBean {
	void destroy() throws Exception;
}
)声明式
  • 添加注解 @PostCtruct(初始化)@PreDestroy(销毁)的方法
代码语言:javascript代码运行次数:0运行复制
public class Book {
	@PostCtruct
    public void initMethod(){
        println("初始化方法");
    }
    @PreDestroy
    public void destroyMethod(){
        println("销毁方法");
    }
}
4)执行顺序

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

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

2、InstantiationAwareBeanPostProcessor实例化后置处理器

  • InstantiationAwareBeanPostProcessor接口是BeanPostProcessor的父接口
  • 在所有实例化前后执行
代码语言:javascript代码运行次数:0运行复制
@Component
@Slf4j
public class MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {

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

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

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

2、BeanPostProcessor初始化后置处理器

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

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

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

4、xxxAware接口

  • 属性填充后,初始化前执行
  • spring aware 目的为了让bean获取spring容器中的服务
    • BeanameAware:获取容器中bean名称
    • BeanFactorAware:获取BeanFactory容器
    • ApplicationContextAware:获取应用上下文
代码语言:javascript代码运行次数:0运行复制
@Component
public class BeanUtil implements ApplicationContextAware {
    private ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
    public Object getBean(String beaname){
        return context.getBean(beaname);
    }
}
三、 总结执行流程

  1. 实例化后置处理器-实例化前
  2. 实例化
  3. 实例化后置处理器-实例化后
  4. 属性填充(扫描@Autowired @Value @Resource 注解,完成自动注入)
  5. 处理Awar接口
  6. 初始化后置处理器-初始化前
  7. 三种方式初始化
  8. 初始化后置处理器-初始化后(会根据情况包装为代理类,即AOP)
  9. 销毁
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:202-07-20,如有侵权请联系 cloudcommunity@tencent 删除接口面试生命周期容器对象

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1162849.html

相关标签:无
上传时间: 2025-07-20 20:30:17
留言与评论(共有 6 条评论)
本站网友 xspc
13分钟前 发表
单例:容器关闭时候销毁;多例:容器关闭不销毁 2
本站网友 吉林五洲花园大酒店
21分钟前 发表
String beaname) throws BeansException { log.debug("初始化后置处理器>>>>>>> 初始化之前执行
本站网友 通讯网络
20分钟前 发表
一旦返回null
本站网友 大奥
17分钟前 发表
xxxAware接口属性填充后
本站网友 蹉跎行
24分钟前 发表
String beaname) throws BeansException { log.debug("初始化后置处理器>>>>>>> 初始化之后执行