代码目录:
bean的生命周期几个过程:创建–>初始化–>销毁
1.@Bean(initMethod=“方法1”,destroyMethod=“方法2”)
public class Bike {
public Bike(){
System.out.println("创建。。。。。");
}
public void init(){
System.out.println("初始化。。。。。");
}
public void destory(){
System.out.println("销毁===========");
}
}
@Configuration
@ComponentScan("com.demo6")
public class SampleConfig {
@Bean(initMethod = "init",destroyMethod = "destory")
public Bike bike(){
return new Bike();
}
}
public class SampleTest {
@Test
public void test01(){
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SampleConfig.class);
String[] names = app.getBeanDefinitionNames();
app.close();
}
}
根据上面代码找到对应调用init()方法的spring源码位置重要代码片段org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java:
2.实现接口InitializingBean, DisposableBean相当于初始与销毁(也可做相应功能的工作)
public class Bike implements InitializingBean, DisposableBean {
public Bike(){
System.out.println("创建。。。。。");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("初始化。。。。。");
}
@Override
public void destroy() throws Exception {
System.out.println("销毁===========");
}
}
@Configuration
@ComponentScan("com.demo6")
public class SampleConfig {
@Bean
public Bike bike(){
return new Bike();
}
}
public class SampleTest {
@Test
public void test01(){
AnnotationConfigApplicationContext app = new AnnotationConfigApplicationContext(SampleConfig.class);
app.close();
}
}
源代码同样为上面提到的重要位置,唯一不同的是实现接口的调用走了两个不同的逻辑,进入org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#invokeInitMethods方法看看:
从上面的代码可知执行优先级高的为接口实现的
@PostConstruct与@PreDestroy为java JSR250注解
public class Bike implements InitializingBean, DisposableBean {
public Bike(){
System.out.println("创建。。。。。");
}
@PostConstruct
public void init2(){
System.out.println("初始化==PostConstruct注解。。。。。");
}
@PreDestroy
public void destory2() throws Exception {
System.out.println("销毁==PreDestroy注解。。。。。。。");
}
}
具体最终调用:
org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor.LifecycleElement#invoke
说明此PostConstruct也是通过InitDestroyAnnotationBeanPostProcessor后置处理器实现的。
优先级此jsr250是最高的。最先执行。
jsr250(PostConstruct/PreDestroy)–>InitializingBean, DisposableBean–>@Bean(initMethod = “”,destroyMethod = “”)
4.使用BeanPostProcessors接口后置处理器完成一个
public class SampleBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//返回一个对象(传过来的对象)
//在初始化方法调用之前进行后置处理工作
//在什么时候调用:initMethod之前
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 null;
}
}
@Configuration
@ComponentScan("com.demo7")
public class SampleConfig {
@Bean(initMethod = "init",destroyMethod = "destory1")
public Bike bike(){
return new Bike();
}
@Bean
public SampleBeanPostProcessor sampleBeanPostProcessor(){
return new SampleBeanPostProcessor();
}
}
在上面图中重要代码位置调用
此优先级可以做到在JSR250之前调用