首页 > 其他分享 >Bean生命周期

Bean生命周期

时间:2024-06-17 09:57:43浏览次数:13  
标签:初始化 生命周期 后置 bean Bean 实例 处理器 public

目录

一、bean生命周期基本流程

二、流程细节

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

1)自定义式:

2) 接口式

3)声明式

4)执行顺序

2、InstantiationAwareBeanPostProcessor实例化后置处理器

2、BeanPostProcessor初始化后置处理器

3、xxxAware接口

三、 总结执行流程

一、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;
    }
}

3、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. 销毁

标签:初始化,生命周期,后置,bean,Bean,实例,处理器,public
From: https://blog.csdn.net/2401_82767224/article/details/139735240

相关文章

  • 【2】软件生命周期
    【一】为什么要测试?【1】软件的非正常运行(有些软件在电量低的情况下不能运行)或其自身的缺陷Bug会引发很多问题。【2】软件是由开发人员编写代码和文档组成的,是人都有可能犯错,测试的工作是需要对开发出来的软件进行测试。【3】环境也会影响软件,以致出现软件失效的现象。【4】测......
  • 名称空间,亲和性,pod生命周期,健康检查
    一、名称空间1、切换名称空间[root@masterpod]#kubectlcreatenstestnamespace/testcreated[root@masterpod]#kubectlgetnsNAMESTATUSAGEdefaultActive10hkube-node-leaseActive10hkube-publicActive10hkube-sy......
  • Unity的生命周期函数
    在Unity中,各个生命周期函数是在特定的时机被调用的,它们的执行顺序如下:1.Awake:当脚本实例被加载时调用,用于初始化数据。如果物体上有多个脚本,它们的Awake方法会在Start方法之前执行。2.OnEnable:当对象变为活动状态(enabled)或脚本被启用时调用。如果在场景加载后对象已经......
  • Spring中Bean的实例化过程
    AbstractAutowireCapableBeanFactory.doCreateBean方法一、调用createBeanInstance方法中会获取容器中所有的BeanPostProcessor对象,并进行循环筛选出来自于SmartInstantiationAwareBeanPostProcessor接口的实现类,并调用实现类的determineCandidateConstructors方法获取到有@......
  • Spring中Bean的初始化创建AbastractApplicationContext.FinishBeanFactoryInitializat
    AbastractApplicationContext.FinishBeanFactoryInitialization模版调用子类DefaultListableBeanFacotry.preInstantiateSingletons通过循环子类DefaultListableBeanFactory中收集到的所有beanDefinitionNames,对满足条件的Bean进行初始化,getBean操作会调用父类AbstractBean......
  • 【Kafka专栏 05】一条消息的完整生命周期:Kafka如何保证消息的顺序消费
    作者名称:夏之以寒作者简介:专注于Java和大数据领域,致力于探索技术的边界,分享前沿的实践和洞见文章专栏:夏之以寒-kafka专栏专栏介绍:本专栏旨在以浅显易懂的方式介绍Kafka的基本概念、核心组件和使用场景,一步步构建起消息队列和流处理的知识体系,无论是对分布式系统感兴趣,还......
  • Spring中GenericBeanDefinition属性
    1.id再Spring容器中作为Bean的唯一标识2.name用于为id属性创建一个或多个别名,用空格、逗号分开3.classBean的类名,全限定名primary多个相同Bean再容器中的优先级5.parent标注该Bean的父类Bean,继承父类Bean的所有属性6.abstract标注Bean是否是抽象的,一般用于父类Bean。......
  • Elasticsearch:简化数据流的数据生命周期管理
    作者:来自Elastic AndreiDan今天,我们将探索Elasticsearch针对数据流的新数据管理系统:数据流生命周期,从版本8.14开始提供。凭借其简单而强大的执行模型,数据流生命周期可让n你专注于数据生命周期的业务相关方面,例如降采样和保留。在后台,它会自动确保存储数据的Elastics......
  • vue3生命周期
    Vue3中有两个注册生命周期的方法,第一个是选项式的API风格,另一个的组合式的API风格。Vue3的生命周期完全兼容Vue2的生命周期。生命周期选项可以和组合式API中的生命周期钩子混合使用,不过最好不要将两者混合使用。生命周期的实现原理其实就是先将用户注册的生命周......
  • Java——变量作用域和生命周期
    一、作用域1、作用域简介在Java中,作用域(Scope)指的是变量、方法和类在代码中的可见性和生命周期。理解作用域有助于编写更清晰、更高效的代码。2、作用域块作用域(BlockScope):块作用域是指在大括号{}内定义的变量的作用域。变量只在其定义的块内可见和有效,包括循环、条件......