使用注解 @PostConstruct 和 @PreDestroy 指定 Bean 的初始化和销毁方法

Spring 注解方式生命周期方法。

Spring 支持多种方式的 Bean 生命周期管理,比如 可以在 Config 类中 通过在方法标记注解 @Bean(initMethod = "init",destroyMethod = "destory")方式。本文主要讲述使用

@PostConstruct 和 @PreDestroy 注解方式。

1、首先@PostConstruct 和 @PreDestroy 是javax.annotation 包定义的,因此需要导入包

<dependency>
     <groupId>javax.annotation</groupId>
     <artifactId>javax.annotation-api</artifactId>
     <version>1.3.2</version>
</dependency>

注意:我使用的是 Idea 开发,pom.xml文件加入配置后,执行 Test 方法,发现报错,解决方法见我的文章:《Error:不支持发行版本5的解决方法 

2、事例代码:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
public class House {

    public House(){
        System.out.println("......House.Constructor()......");
    }

    @PostConstruct
    public void init(){
        System.out.println("......House.init()......");
    }

    @PreDestroy
    public void destroy(){
        System.out.println("......House.destroy()......");
    }
}
事例代码 Bean
@Configuration
@ComponentScan(basePackages = "com.kenny.spring.annotation.bean")
public class MainConfigLifeCycle {

}
事例代码 Config 类
public class IOCLifeCycleTest {
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigLifeCycle.class);

    protected void printBeanName(){
        String[] names = applicationContext.getBeanDefinitionNames();
        for(String name:names)
            System.out.println("bean name:"+name);

    }

    @Test
    public void test02(){
        this.printBeanName();
    }
事例代码 单元测试

运行结果为:

......House.Constructor()......
......House.init()......

当调用 applicationContext.close();方法后,执行销毁方法,结果为:

......House.destroy()......

3、其他情况测试

     1⃣️.修改 Scope属性为:ConfigurableBeanFactory.SCOPE_PROTOTYPE,并未执行 construct 和 init 方法,在获取 bean 的时候才进行初始化和执行初始化方法,并且容器关闭时业务调用destroy方法,因此需要销毁 ConfigurableBeanFactory.SCOPE_PROTOTYPE 标记的 Bean 时,需要手动销毁。

     2⃣️.再加入一个类,Scope 默认为ConfigurableBeanFactory.SCOPE_SINGLETON 单例模式,执行测试,并调用销毁方法,执行结果为:

......House.Constructor()......
......House.init()......
......Car.Constructor()......
......Car.init()......

......Car.destory()......
......House.destroy()......

       显示Spring 创建和销毁 bean 的执行链

猜你喜欢

转载自www.cnblogs.com/KennyWang0314/p/12274049.html