• spring bean 生命周期


    目录

    一、概述

    二、实例化

    三、属性注入 

    四、处理Aware接口

    五、初始化前

    六、自定义初始化方法 

    七、初始化后

    八、销毁

    九、代码示例


    一、概述

    Spring Bean是Spring框架的核心概念,bean 的生命周期有 spring IOC容器管理,bean 生命周期包括:实例化 -> 属性注入  ->  处理Aware接口  -> BeanPostProcessor(初始化前)  ->   自定义初始化方法 ->  BeanPostProcessor (初始化后) ->  使用  ->  销毁

    二、实例化

    启动spring时,IOC容器会找到所有bean,通过反射实例化。

    三、属性注入 

    可通过字段加注解Autowired(字段注入,如果这个字段是接口并且已经有bean实现了,也会注入,属于接口注入),还可通过setter方法加注解Autowired(setter注入,setter的参数会自动注入)

    四、处理Aware接口

    如果bean实现了Aware下的接口(BeanNameAwareBeanFactoryAware、ApplicationContextAware),Spring会自动调用相应的setter方法,将相关的资源注入进去。

    五、初始化前

    Spring会检查实现了BeanPostProcessor接口的bean,调用postProcessBeforeInitialization

    六、自定义初始化方法 

    实现InitializingBean,定义方法。

    七、初始化后

    Spring会检查实现了BeanPostProcessor接口的bean,调用postProcessAfterInitialization

    八、销毁

    可通过java注解PreDestroy,也可以实现DisposableBean

    九、代码示例

    1. import org.springframework.beans.BeansException;
    2. import org.springframework.beans.factory.DisposableBean;
    3. import org.springframework.beans.factory.InitializingBean;
    4. import org.springframework.beans.factory.annotation.Autowired;
    5. import org.springframework.context.ApplicationContext;
    6. import org.springframework.context.ApplicationContextAware;
    7. import org.springframework.stereotype.Component;
    8. import javax.annotation.PostConstruct;
    9. import javax.annotation.PreDestroy;
    10. //通过注解方式生命这是一个bean,交给springIOC容器管理
    11. @Component
    12. public class BeanDemo implements ApplicationContextAware, InitializingBean, DisposableBean {
    13. //字段注入
    14. @Autowired
    15. private ApplicationContext applicationContext1;
    16. private ApplicationContext applicationContext2;
    17. public BeanDemo() {
    18. System.out.println("1、通过反射创建bean");
    19. }
    20. //setter注入
    21. @Autowired
    22. public void setApplicationContext2(ApplicationContext applicationContext) {
    23. System.out.println("2、setter注入(Autowired方法)");
    24. this.applicationContext2 = applicationContext;
    25. }
    26. @Autowired
    27. private void init1() {
    28. System.out.println("2、Autowired方法");
    29. }
    30. @PostConstruct
    31. private void init2() {
    32. System.out.println("5、java注解PostConstruct一般用于执行一些初始化操作");
    33. }
    34. @Override
    35. public void afterPropertiesSet() {
    36. System.out.println("5、InitializingBean实现自定义初始化方法");
    37. }
    38. @Override
    39. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    40. System.out.println("3、aware接口处理, setApplicationContext方法");
    41. }
    42. @PreDestroy
    43. private void myPreDestroy() {
    44. System.out.println("7、java注解PreDestroy");
    45. }
    46. @Override
    47. public void destroy() {
    48. System.out.println("7、DisposableBean");
    49. }
    50. }
    1. import org.springframework.beans.BeansException;
    2. import org.springframework.beans.factory.annotation.Autowired;
    3. import org.springframework.beans.factory.config.BeanPostProcessor;
    4. import org.springframework.context.ConfigurableApplicationContext;
    5. import org.springframework.stereotype.Component;
    6. @Component
    7. public class BeanManage implements BeanPostProcessor {
    8. @Autowired
    9. private ConfigurableApplicationContext context;
    10. @Override
    11. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    12. if (bean instanceof BeanDemo) {
    13. System.out.println("4、 postProcessBeforeInitialization" + beanName);
    14. }
    15. return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    16. }
    17. @Override
    18. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    19. if (bean instanceof BeanDemo) {
    20. System.out.println("6、 postProcessAfterInitialization" + beanName);
    21. context.close();
    22. }
    23. return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
    24. }
    25. }

    控制台结果:

    1、通过反射创建bean
    2、Autowired方法
    2、setter注入(Autowired方法)
    3、aware接口处理, setApplicationContext方法
    4、 postProcessBeforeInitializationbeanDemo
    5、java注解PostConstruct一般用于执行一些初始化操作
    5、InitializingBean实现自定义初始化方法
    6、 postProcessAfterInitializationbeanDemo
    7、java注解PreDestroy
    7、DisposableBean

  • 相关阅读:
    debian 11安装搜狗输入法
    uniAPP小程序 子组件使用watch不生效,H5正常,小程序不正常(其实是子组件model选项的问题)
    【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)
    SpringBoot 中如何集成mybatis+Druid+mybatis generator呢?
    【Spring注解必知必会】深度解析@Configuration注解
    数说故事与暨南大学达成“大数据+AI+传媒”全面战略合作
    Java“牵手”速卖通商品详情数据,速卖通商品详情接口,速卖通API接口申请指南
    【揭秘Vue】nextTick的神秘面纱:原理与作用一览无余!
    MFC Windows 程序设计[138]之黑白钢琴键(附源码)
    SSL证书也会失效?什么情况下SSL证书会失效呢?
  • 原文地址:https://blog.csdn.net/q3198215426/article/details/133923748