• Spring Bean 的生命周期


    一、生命周期

    1. 实例化:Spring 创建 Bean 实例。
    2. 属性赋值:将配置文件中定义的属性值或注入的依赖赋值给 Bean 的属性。
    3. 初始化:
      1. 执行各种通知:如果 Bean 实现了 BeanNameAware、BeanFactoryAware 等接口,Spring 会调用相应的方法通知 Bean 名称和 Bean 工厂等信息。
      2. 执行前置处理方法:如果有 BeanPostProcessor,Spring 会调用其 postProcessBeforeInitialization 方法。
      3. 执行初始化方法:如果 Bean 实现了 InitializingBean 接口,Spring 会调用其 afterPropertiesSet 方法;如果配置了自定义初始化方法,Spring 也会调用该方法。
      4. 执行后置处理方法:如果有 BeanPostProcessor,Spring 会调用其 postProcessAfterInitialization 方法。
    4. 销毁:当 Bean 不再需要时,Spring 会进行销毁操作:
      • 如果 Bean 实现了 DisposableBean 接口,Spring 会调用其 destroy 方法。
      • 如果配置了自定义销毁方法,Spring 也会调用该方法。
    5. 销毁:当 Bean 不再需要时,Spring 会进行销毁操作:
      • 如果 Bean 实现了 DisposableBean 接口,Spring 会调用其 destroy 方法。
      • 如果配置了自定义销毁方法,Spring 也会调用该方法。

    二、代码实战

    在这里插入图片描述
    MainApp

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    
    public class MainApp {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
            OrderService orderService = (OrderService) context.getBean("orderService");
            System.out.println("使用 orderService " + orderService);
            ((ClassPathXmlApplicationContext) context).close();
        }
    }
    

    OrderService

    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanFactory;
    import org.springframework.beans.factory.BeanFactoryAware;
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    
    
    public class OrderService implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
        private String beanName;
        private BeanFactory beanFactory;
        private String config;
    
        public OrderService() {
            System.out.println("OrderService 实例化");
        }
    
        /**
         * 属性赋值,在实际项目中可以类比成使用 @Autowired 注解注入某个对象,使用 @Value 注解注入某个属性的值
         */
        public void setConfig(String config) {
            this.config = config;
            System.out.println("属性赋值:" + config);
        }
    
        /**
         * 执行各种名称-设置 Bean 的名称
         */
        @Override
        public void setBeanName(String name) {
            this.beanName = name;
            System.out.println("通知 Bean 名称:" + beanName);
        }
    
        /**
         * 执行各种名称-设置 Bean 的工厂
         */
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
            System.out.println("通知 Bean 工厂:" + beanFactory);
        }
    
        /**
         * 这个就是 bean 生命周期中的初始化方法
         */
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("初始化方法,加载配置 " + config);
            // 模拟加载配置文件
            if ("orderConfig".equals(config)) {
                System.out.println("加载配置文件成功");
            } else {
                System.out.println("加载配置文件失败");
            }
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("销毁方法,资源释放");
        }
    
        public String getConfig() {
            return config;
        }
    }
    

    OrderServicePostProcessor

    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    
    
    public class OrderServicePostProcessor implements BeanPostProcessor {
        /**
         * 初始化之前的前置处理方法
         */
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof OrderService) {
                System.out.println("前置处理方法:" + beanName);
                // 记录日志
                System.out.println("准备初始化 OrderService");
            }
    
            return bean;
        }
    
        /**
         * 初始化之后的后置处理方法
         */
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            if (bean instanceof OrderService) {
                System.out.println("后置处理方法:" + beanName);
                // 进行一些验证
                OrderService orderService = (OrderService) bean;
                if (orderService.getConfig() == null || !"orderConfig".equals(orderService.getConfig())) {
                    System.out.println("配置为空,初始化失败");
                    return null;
                } else {
                    System.out.println("初始化成功");
                }
            }
    
            return bean;
        }
    }
    
    

    bean.xml

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean id="orderService" class="cn.xiucai.beantest.ordertest.OrderService">
            <property name="config" value="orderConfig"/>
        bean>
    
        <bean class="cn.xiucai.beantest.ordertest.OrderServicePostProcessor"/>
    beans>
    

    代码输出结果
    在这里插入图片描述

  • 相关阅读:
    应广PMC131 SOP16 16pin八位单片机
    安全物理环境(设备和技术注解)
    linux使用命令反弹到 msf
    Pinia基础知识
    Linux安装Keepalived
    FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6
    Redis 主从复制
    python(48): 进程,线程 ,协程
    202311.13 windows通过vscode ssh远程连接到Ubuntu 连接失败 waiting for server log
    容器编排Docker-Compose少不了
  • 原文地址:https://blog.csdn.net/qq_40258748/article/details/139480728