Spring Bean的生命周期
-
在創(chuàng)建bean的時候,指定init和detroy方法.
package com.wzl.yanyan.spring01.beanlifecycle; public class Car { public Car(){ System.out.println("this is constructor method..."); } public void init(){ System.out.println("this car init method...."); } public void destroy(){ System.out.println("this is car destroy method..."); } }
package com.wzl.yanyan.spring01.config;
import com.wzl.yanyan.spring01.beanlifecycle.Car;
import org.springframework.context.annotation.Bean;
public class MainConfig4 {
@Bean(initMethod = "init",destroyMethod = "destroy")
public Car beanLifeCycle(){
return new Car();
}
}
- 指定initMethod,detroyMethod.
package com.wzl.yanyan.spring01.beanlifecycle;
import org.springframework.beans.factory.InitializingBean;
public class Shape implements InitializingBean {
public Shape(){
System.out.println("這是shape類的無參構(gòu)造器");
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("執(zhí)行 初始化bean的方法");
}
}
package com.wzl.yanyan.spring01.config;
import com.wzl.yanyan.spring01.beanlifecycle.Shape;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
public class MainConfig5 {
// @Scope("p")
@Bean
public Shape initBean(){
return new Shape();
}
}
-
實現(xiàn)DisposableBean接口,在容器關(guān)閉時,自動調(diào)用方法
package com.wzl.yanyan.spring01.beanlifecycle; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class Shape implements InitializingBean, DisposableBean { public Shape(){ System.out.println("這是shape類的無參構(gòu)造器"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("執(zhí)行 初始化bean的方法"); } @Override public void destroy() throws Exception { System.out.println("this shape bean is destroy method"); } }
第三中方法 通過注解的方式,在bean實例化,并且屬性賦值之后,執(zhí)行的方法.@PreDestroy注解和@PostConstruct注解
- @PreDestroy和@PostConstruct注解,屬于javaEE的規(guī)范.注解位于 java.xml.ws.annotation包是Java EE的模塊的一部分。J2EE已經(jīng)在Java 9中被棄用饭庞,并且計劃在Java 11中刪除它旺罢。關(guān)注 JSR250規(guī)范,參考連接
Spring 還提供了第四種Java,處理java的生命周期的處理器.
- 處理器,BeanPostProcessor接口
- 在Bean的初始化的前后,進(jìn)行一些操作.
- 接口有二個方法,postProcessBeforeInitialization在任何初始化方法調(diào)用之前,調(diào)用這個方法.比如在調(diào)用PostConstruct初始化方法,或者調(diào)用init-method初始化方法.
- postProcessAfterInitialization 方法是在初始化方法調(diào)用結(jié)束之后調(diào)用這個方法.
Spring 源碼查看
-
為什么實現(xiàn)了BeanPostProcessor類的postProcessBeforInitiallization,能夠在Bean初始化之前,調(diào)用這個方法.弄清楚這個問題,需要查看spring的源碼.查看類,AbstractAutowireCapableBeanFactory中的方法,initializeBean,其中調(diào)用了方法applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName),這個方法就是自定義的postProcessBeforInitiallization.接下來會執(zhí)行語句:
invokeInitMethods(beanName, wrappedBean, mbd);
invokeInitMethods方法就是進(jìn)行組件初始化賦值的方法.查看后續(xù)語句:
if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); }
applyBeanPostProcessorsAfterInitialization方法,即方法postProcessAfterInitialization ,在Bean初始化之后調(diào)用.接著查看applyBeanPostProcessorsBeforeInitialization方法:
@Override public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor processor : getBeanPostProcessors()) { Object current = processor.postProcessBeforeInitialization(result, beanName); if (current == null) { return result; } result = current; } return result; }
查看方法applyBeanPostProcessorsAfterInitialization:
@Override public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (BeanPostProcessor processor : getBeanPostProcessors()) { Object current = processor.postProcessAfterInitialization(result, beanName); if (current == null) { return result; } result = current; } return result; }
遍歷組件中,所有的postProcessBeforinitiallization,初始化前置處理器,便利組件中,所有的applyBeanPostProcessorsAfterInitialization,初始化后置處理器.注意,如果其中有一個方法返回null,整個方法就會停止執(zhí)行
在執(zhí)行initializeBean這個方法之前,會執(zhí)行populateBean(beanName, mbd, instanceWrapper);這個方法.populateBean這個方法的作用是給熟悉進(jìn)行賦值
研究一下 BeanPostProcessor這個類.
- spring 底層對BeanPostProcessor的使用.
- Bean的賦值,使用了BeanPostProcessor.
- AutoWired 注解
- 生命周期注解
- @Aysnc,xxx等