欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring 之 bean 的生命周期

程序员文章站 2022-03-03 12:39:30
...

bean 的生命周期是指 bean 的创建–初始化–销毁的过程

由容器管理 bean 的生命周期

可以自定义初始化和销毁方法,容器在 bean 进行到当前生命周期的时候调用自定义的初始化和销毁方法

一、使用 @Bean 指定 init-methoddestroy-method 注解配置

传统的 xml 方式,指定初始化和销毁方法
<bean id="person" class="cn.duniqb.bean.Person" init-method="XXX" destroy-method="XXX">
    <property name="age" value="18"/>
    <property name="name" value="zs"/>
</bean>
使用注解

Bean 的代码

public class Car {
    public Car() {
        System.out.println("car constructor...");
    }
    public void init() {
        System.out.println("car init...");
    }
    public void destroy() {
        System.out.println("car destroy...");
    }
}

在配置类中指定初始化和销毁方法

@Configuration
public class MainConfigLifeCycle {
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public Car car() {
        return new Car();
    }
}

测试

public class IOCTestListCycle {
    @Test
    public void test01() {
        // 创建 IOC 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigLifeCycle.class);
        System.out.println("容器创建完成...");
        // 关闭
        applicationContext.close();
    }
}

输出

car constructor...
car init...
容器创建完成...
car destroy...

可以看到,在容器创建时调用构造方法和初始化方法,在主动关闭时,调用销毁方法

总结:

  • 构造对象(对象创建)
    • 单实例:在容器启动时创建对象
    • 多实例:在每次获取时创建对象
  • 初始化
    • 对象创建完成,并赋值完成后调用初始化方法
  • 销毁
    • 单实例:容器关闭时销毁
    • 多实例:容器不会管理这个 bean,不会调用销毁方法

二、通过让 bean 实现 InitializingBean(定义初始化逻辑),DisposableBean(定义销毁逻辑)

实现 Spring 提供的 2 个接口

@Component
public class Cat implements InitializingBean, DisposableBean {
    public Cat() {
        System.out.println("cat constructor...");
    }
    @Override
    public void destroy() throws Exception {
        System.out.println("cat destroy...");
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("cat afterPropertiesSet...");
    }
}

在配置类扫描

@ComponentScan("cn.duniqb.bean")
@Configuration
public class MainConfigLifeCycle {}

达到相同效果

三、使用 JSR250

四、使用BeanPostProcessor:bean 的后置处理器

在 bean 初始化前后进行一些处理工作

postProcessBeforeInitialization

postProcessAfterInitialization

@Component
public class MyBeanPostPorcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization..." + beanName + "..." + bean);
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization..." + beanName + "..." + bean);
        return bean;
    }
}
相关标签: Spring 生命周期