注册到Spring容器中的Bean的生命周期方法
1.基于xml文件配置注册到spring容器中
使用bean标签内的init-method和destory-method属性
<bean name="myStudent" class="com.example.Student" scope="singleton" init-method="aaa" destroy-method="bbb"></bean>
2.基于该Bean方法体注解
在方法体上增加注解@PostConstruct和@PreDestory
public class Bean1 {
@PostConstruct
public void m1(){
System.out.println("初始化");
}
@PreDestroy
public void m2(){
System.out.println("销毁");
}
}
3.基于类方法注入注解@Bean
需要注入的Bean
public class Bean1 implements InitializingBean,DisposableBean {
public void m3(){
System.out.println("m3初始化");
}
public void m4(){
System.out.println("m4销毁");
}
}
开发注入的Bean和方法
@Configuration
public class ApplicationConfig {
//注入外部bean
@Bean(initMethod ="m3" ,destroyMethod = "m4")
public Bean1 bean1(){
return new Bean1();
}
}
测试方法
public class Demo1 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
//Bean的名称默认是方法名
// String m1 = context.getBean("abc", String.class);
// System.out.println(m1);
// Object obj = context.getBean("obj");
// Object obj1 = context.getBean("obj");
// System.out.println(obj==obj1);
Bean1 bean1 = context.getBean("bean1", Bean1.class);
}
}
4.基于接口实现
InitializingBean和DisposableBean,并实现对应的方法:
afterPropertiesSet
destroy
public class Bean1 implements InitializingBean,DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init创建");
}
@Override
public void destroy() throws Exception {
System.out.println("destory");
}
}
5. 完整代码&优先级测试结果
Bean1
public class Bean1 implements InitializingBean,DisposableBean {
public void m3(){
System.out.println("m3初始化");
}
public void m4(){
System.out.println("m4销毁");
}
@PostConstruct
public void m1(){
System.out.println("初始化");
}
@PreDestroy
public void m2(){
System.out.println("销毁");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("init创建");
}
@Override
public void destroy() throws Exception {
System.out.println("destory");
}
}
注入类
@Configuration
public class ApplicationConfig {
//注入外部bean
@Bean(initMethod ="m3" ,destroyMethod = "m4")
public Bean1 bean1(){
return new Bean1();
}
}
测试代码:
public class Demo1 {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
Bean1 bean1 = context.getBean("bean1", Bean1.class);
context.close();
}
}
显示结果:
因此优先级顺序是:
@PostConstruct > 接口实现afterPropertiesSet() > @Bean(initMethod =“m3” ,destroyMethod = “m4”)