Spring 注解方式生命周期方法。
Spring 支持多种方式的 Bean 生命周期管理,比如 可以在 Config 类中 通过在方法标记注解 @Bean(initMethod = "init",destroyMethod = "destory")方式。本文主要讲述使用
@PostConstruct 和 @PreDestroy 注解方式。
1、首先@PostConstruct 和 @PreDestroy 是javax.annotation 包定义的,因此需要导入包
<dependency> <groupId>javax.annotationgroupId> <artifactId>javax.annotation-apiartifactId> <version>1.3.2version> 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()......"); } }
@Configuration @ComponentScan(basePackages = "com.kenny.spring.annotation.bean") public class MainConfigLifeCycle { }
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 的执行链