這是Spring註解專題系類文章,本系類文章適合Spring入門者或者原理入門者,小編會在本系類文章下進行企業級應用實戰講解以及spring源碼跟進。
本文來自公衆號:B一下爪哇
前面一章提過,在配置類中經過@Bean來將組件注入到容器中,在容器中,Bean的生命週期大抵上能夠分爲建立--初始化--銷燬的過程,容器管理着組件的所有生命週期。Bean註解源碼裏面包含initMethod和destroyMethod兩個屬性,能夠分別來自定義bean的初始化方法和銷燬方法。自定義格式:
spring
@Bean(initMethod=,destoryMethod=)
測試:
先在Bean中自定義初始化和銷燬方法:maven
public class ExampleBean { private String name; private int age; ..... public void init(){ System.out.println("ExampleB init..."); } public void destory(){ System.out.println("Example destory..."); } }
配置類:ide
@Configuration public class BaseConfig { @Bean(value="beanIdDefinition",initMethod = "init",destroyMethod = "destory") public ExampleBean exampleBean(){ return new ExampleBean(); } }
測試類:post
@Test public void shouldAnswerWithTrue() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(BaseConfig.class); System.out.println("IOC容器建立完成..."); String[] beanDefinitionNames = ctx.getBeanDefinitionNames(); ctx.close(); }
output:測試
exampleBean constructor...... ExampleB init... IOC容器建立完成... Example destory...
由此可知,在容器初始化過程當中已經完成對bean的初始化工做,而且在容器關閉途中,調用bean的銷燬方法。(下一章分析容器初始化大體作了哪一些工做)spa
InitializingBean的afterPropertiesSet在設置提供Bean的屬性值後由BeanFactory調用進行方法調用。
DisposableBean的destory在Bean單例被破壞時由BeanFactory進行方法調用。
定義Bean並實現這兩個接口code
public class LifeCycleBean implements InitializingBean, DisposableBean{ @Override public void afterPropertiesSet() throws Exception { System.out.println("LifeCycleBean afterPropertieSet...."); } @Override public void destroy() throws Exception { System.out.println("LifeCycleBean destory...."); } }
output:接口
LifeCycleBean afterPropertieSet.... IOC容器建立完成... LifeCycleBean destory....
JSR是Java Specification Requests的縮寫,意思是Java 規範提案。
JSR250已經添加至Java SE6中,經常使用的大概就是PostConstruct初始化、PreDestory銷燬、Resource資源等。
Spring支持JSR250的註解。PostConstruct在bean建立完成而且屬性賦值完成;來執行初始化方法;PreDestory在容器銷燬bean以前回調通知;Resource支持bean自動裝配,相似Autowired。
使用方式,在Bean中直接添加:生命週期
@PostConstruct public void initPost(){ System.out.println("ExampleBean JSR250 PostConstruct..."); } @PreDestroy public void destoryPre(){ System.out.println("ExampleBean JSR250 PreDestory..."); }
測試output:圖片
exampleBean constructor...... ExampleBean JSR250 PostConstruct... IOC容器建立完成... ExampleBean JSR250 PreDestory...
BeanPostProcessor【接口】:bean後置處理器在Bean的生命週期起到一個承上啓下的做用,在Bean初始化先後進行處理工做。
兩個方法都包含2個相同的參數:
@param Object o:Bean實例
@param String s:beanName
定義一個Bean實現後置處理器接口:
public class BeanPostProcessorDefinition implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object o, String s) throws BeansException { System.out.println("postProcessBeforeInitialization -->"+s+" = "+o); return o; } @Override public Object postProcessAfterInitialization(Object o, String s) throws BeansException { System.out.println("postProcessorAfterInitialization -->"+s+"="+o); return o; } }
以容器中存在的id爲exampleBean的bean爲例:查看output:
//部分容器初始化的一些bean exampleBean constructor...... postProcessBeforeInitialization -->exampleBean = ExampleBean{name='null', age=0} ExampleBean JSR250 PostConstruct... postProcessorAfterInitialization -->exampleBean=ExampleBean{name='null', age=0} IOC容器建立完成...
由此不可貴出,在容器初始化過程當中,大體依次完成bean的建立,實例化,屬性賦值,執行bean後置處理器初始化以前的方法,執行初始化方法,執行bean後置處理器初始化以後的方法。