spring bean的生命周期

在Spring框架中,Spring Beans的生命周期是从创建到销毁的一系列过程。这个过程包括了多个阶段,每个阶段都可以通过不同的方式来定制和干预。下面是一个典型的Spring Bean生命周期的概述:

实例化 Bean → 属性填充 → Aware接口回调 → BeanPostProcessor前置处理 → InitializingBean → 自定义初始化方法 → BeanPostProcessor后置处理 → Bean就绪 → Bean销毁

目录

1. 实例化

2. 属性填充

3.Aware 接口回调(按顺序执行)

1. BeanNameAware接口

2. BeanFactoryAware接口

3. ApplicationContextAware接口

4. BeanPostProcessor接口(前置、后置处理)

5. InitializingBean接口

6. 自定义初始化方法

7. 使用Bean

8. 销毁

 9.spring bean生命周期总结


1. 实例化

  • 创建Bean实例:当Spring容器启动时,它会根据配置创建Bean的实例。这可以通过构造器、工厂方法或实例化方法来完成。

2. 属性填充

  • 设置属性值:一旦Bean实例被创建,Spring会通过依赖注入(Dependency Injection, DI)将所有配置的属性值注入到Bean中。这包括通过setter方法设置属性值或直接在构造器中注入。

3.Aware 接口回调(按顺序执行)

    1. BeanNameAware接口

    • 实现BeanNameAware:如果Bean实现了BeanNameAware接口,Spring会调用其setBeanName(String name)方法,将Bean的ID传递给Bean实例。

    public interface BeanNameAware extends Aware {
        void setBeanName(String name);
    }

    2. BeanFactoryAware接口

    • 实现BeanFactoryAware:如果Bean实现了BeanFactoryAware接口,Spring会调用其setBeanFactory(BeanFactory beanFactory)方法,将BeanFactory引用传递给Bean实例。

    public interface BeanFactoryAware extends Aware {
        void setBeanFactory(BeanFactory beanFactory) throws BeansException;
    }

    3. ApplicationContextAware接口

    • 实现ApplicationContextAware:如果Bean实现了ApplicationContextAware接口,Spring会调用其setApplicationContext(ApplicationContext ctx)方法,将ApplicationContext引用传递给Bean实例。

    public interface ApplicationContextAware extends Aware {
        void setApplicationContext(ApplicationContext applicationContext) throws BeansException;
    }

    4. BeanPostProcessor接口(前置、后置处理)

    • BeanPostProcessor处理:在Bean初始化前后,Spring容器会调用所有实现了BeanPostProcessor接口的Bean的postProcessBeforeInitializationpostProcessAfterInitialization方法。这允许开发者修改Bean的属性值或进行其他处理。

    public interface BeanPostProcessor {
        @Nullable
        default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    
        @Nullable
        default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            return bean;
        }
    }

    5. InitializingBean接口

    • 实现InitializingBean:如果Bean实现了InitializingBean接口,Spring会调用其afterPropertiesSet()方法。这个方法在属性填充后被调用,用于执行初始化代码。

    public interface InitializingBean {
        void afterPropertiesSet() throws Exception;
    }

     注意:InitializingBean接口在BeanPostProcessor.postProcessBeforeInitialization之后,BeanPostProcessor.postProcessAfterInitialization方法之前执行

    6. 自定义初始化方法

    • 自定义初始化方法:可以在配置文件中指定一个或多个初始化方法,这些方法会在属性填充和BeanPostProcessor处理之后被调用。例如,可以通过@PostConstruct注解标注的方法来实现。

      • @PostConstruct注解方法
        JSR-250 标准注解,由 Spring 的CommonAnnotationBeanPostProcessor处理。
      • InitializingBean.afterPropertiesSet()
        Spring 接口方法,在@PostConstruct之后执行。
      • 自定义初始化方法
        通过 XML 配置的init-method属性、@Bean(initMethod="...")@Configuration类中的方法指定。

     通过@PostConstruct注解标注的方法来实现:

        @PostConstruct
        public void init() {
            System.out.println("Bean is initialized");
        }

    7. 使用Bean

    • Bean准备就绪:此时,Bean已经完全初始化并可以使用了。

    8. 销毁

    • 销毁Bean:当容器关闭时,所有Singleton作用域的Bean都会被销毁。如果Bean实现了DisposableBean接口,Spring会调用其destroy()方法;或者如果有指定了自定义的销毁方法(例如通过@PreDestroy注解),这些方法也会被调用。

    public interface DisposableBean {
        void destroy() throws Exception;
    }

    9.spring bean生命周期总结

    spring bean生命周期总结
    生命周期阶段包含步骤
    实例化实例化
    属性填充属性填充
    初始化

    Aware 接口回调 → BeanPostProcessor 前置 → @PostConstruct → InitializingBean → 自定义 init-method → BeanPostProcessor 后置

    使用使用Bean
    销毁销毁Bean

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

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

    余额充值