标签:name void 实现 stp 顺序 cep image life 完成
通常,bean的初始化和销毁方法我们有三个地方可以入手,分别是:
bean的生命周期:实例化 -> 属性赋值 -> 初始化 -> 销毁
? 容器管理bean的生命周期:我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
构造(对象创建):
销毁:
? 定义一个Person类,然后定义两个方法,一个是我们想作为初始化方法的init方法,一个是我们想作为销毁方法的destory方法
public class Person {
public Person() {
System.out.println("Person...constructor");
}
public void init(){
System.out.println("Person...init");
}
public void destroy(){
System.out.println("Person...destroy");
}
}
? 将Person添加到配置类当中
@Configuration
public class LifeCycleConfig {
@Bean(initMethod = "init",destroyMethod = "destroy")
public Person person(){
return new Person();
}
}
? 测试结果
public class LifeCycleConfigTest {
@Test
public void testLifeCycle(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(LifeCycleConfig.class);
System.out.println("容器创建完成了...");
applicationContext.close();
}
}
/**
Person...constructor
Person...init
容器创建完成了...
Person...destroy
*/
? 我们还是在之前的Person类代码上继续编写
public class Person implements InitializingBean,DisposableBean{
public Person() {
System.out.println("Person...constructor");
}
public void init(){
System.out.println("Person...init");
}
public void destry(){
System.out.println("Person...destroy");
}
/**
* 当beanFactory关闭且bean为单例的对象时触发
* @throws Exception
*/
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean...Person.....destroy....");
}
/**
* 当beanFactory实例化bean后,将所有的属性值设置完毕之后,才会调用该接口方法。
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean...Person.....afterPropertiesSet....");
}
}
? 测试结果
/**
Person...constructor
InitializingBean...Person.....afterPropertiesSet....
Person...init
容器创建完成了...
DisposableBean...Person.....destroy....
Person...destroy
*/
可以看到,
? 继续在上面的Person代码上修改
public class Person implements InitializingBean,DisposableBean{
public Person() {
System.out.println("Person...constructor");
}
public void init(){
System.out.println("Person...init");
}
public void destry(){
System.out.println("Person...destroy");
}
@PostConstruct
public void PostConstruct() {
System.out.println("JSR250....PostConstruct....Person ... PostConstruct...");
}
@PreDestroy
public void PreDestroy() {
System.out.println("JSR250....PreDestroy....Person ... PreDestroy...");
}
/**
* 当beanFactory关闭且bean为单例的对象时触发
* @throws Exception
*/
@Override
public void destroy() throws Exception {
System.out.println("DisposableBean...Person.....destroy....");
}
/**
* 当beanFactory实例化bean后,将所有的属性值设置完毕之后,才会调用该接口方法。
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("InitializingBean...Person.....afterPropertiesSet....");
}
}
? 测试结果:
/**
Person...constructor
JSR250....PostConstruct....Person ... PostConstruct...
InitializingBean...Person.....afterPropertiesSet....
Person...init
容器创建完成了...
JSR250....PreDestroy....Person ... PreDestroy...
DisposableBean...Person.....destroy....
Person...destroy
*/
可以看到:
? BeanPostProcessor是bean的后置处理器,在bean初始化前后进行一些处理工作:
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作
直接观察代码,会发现BeanPostProcessor的方法postProcessBeforeInitialization有返回类型Object,
postProcessAfterInitialization也有返回类型Object,同时两个方法都可以抛出BeansException异常。
? 首先定义一个我们自己的BeanPostProcessor:
@Component
public class LifeCycleBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Person) {
System.err.println("postProcessBeforeInitialization....拦截指定bean");
}
System.out.println("这句话证明所有容器中的bean都会被postProcessBeforeInitialization拦截.. beanName=" + beanName + "==>" + bean);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Person) {
System.err.println("postProcessAfterInitialization.....拦截指定bean");
}
System.out.println("这句话证明所有容器中的bean都会被postProcessAfterInitialization拦截.. beanName=" + beanName + "==>" + bean);
return bean;
}
}
? 接着在配置类中添加注解包扫描:
@Configuration
@ComponentScan("com.zl")
public class LifeCycleConfig {
@Bean(initMethod = "init",destroyMethod = "destry")
public Person person(){
return new Person();
}
}
? 测试结果:
第一个标示点:说明所有容器加载的bean在实例化之后,初始化之前都会执行postProcessBeforeInitialization方法,在初始化完成后执行postProcessAfterInitialization方法。
第二个标示点:说明我们可以只拦截我们指定的bean,并且执行的顺序是:
以上九点,按顺序执行,完成bean的初始化和销毁工作。
需要注意的是,BeanPostProcessor提供的两个方法,是针对初始化前后的拦截操作,和容器的关闭,bean的销毁无关。
标签:name void 实现 stp 顺序 cep image life 完成
原文地址:https://www.cnblogs.com/lee0527/p/11748299.html