Bean的生命周期——init-method和destroy-method - 通过让Bean实现InitializingBean,DisposableBean--BeanPostProcessor
生活随笔
收集整理的這篇文章主要介紹了
Bean的生命周期——init-method和destroy-method - 通过让Bean实现InitializingBean,DisposableBean--BeanPostProcessor
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
* bean的生命周期: * bean創建---初始化----銷毀的過程 * 容器管理bean的生命周期; * 我們可以自定義初始化和銷毀方法;容器在bean進行到當前生命周期的時候來調用我們自定義的初始化和銷毀方法 * * 構造(對象創建) * 單實例:在容器啟動的時候創建對象 * 多實例:在每次獲取的時候創建對象\ * * BeanPostProcessor.postProcessBeforeInitialization * 初始化: * 對象創建完成,并賦值好,調用初始化方法。。。 * BeanPostProcessor.postProcessAfterInitialization* 銷毀: * 單實例:容器關閉的時候 * 多實例:容器不會管理這個bean;容器不會調用銷毀方法;
Car.java
package com.dym.bean;public class Car {public Car(){System.out.println("car constructor...");}public void init(){System.out.println("car ... init...");}public void destroy(){System.out.println("car ... destroy...");}}MainConfigOfLifeCycle.class
package com.dym.config;import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope;import com.dym.bean.Car;@Configuration public class MainConfigOfLifeCycle {//@Scope("prototype")@Bean(initMethod="init",destroyMethod="destroy")public Car car(){return new Car();}}IOCTest_LifeCycle.class
package com.dym.test;import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.dym.config.MainConfigOfLifeCycle;public class IOCTest_LifeCycle {@Testpublic void test01(){//1、創建ioc容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);System.out.println("容器創建完成...");applicationContext.getBean("car");//關閉容器applicationContext.close();}}* 1)、指定初始化和銷毀方法; * 通過@Bean指定init-method和destroy-method;* 2)、通過讓Bean實現InitializingBean(定義初始化邏輯), * DisposableBean(定義銷毀邏輯);* 3)、可以使用JSR250; * @PostConstruct:在bean創建完成并且屬性賦值完成;來執行初始化方法 * @PreDestroy:在容器銷毀bean之前通知我們進行清理工作* 4)、BeanPostProcessor【interface】:bean的后置處理器; * 在bean初始化前后進行一些處理工作; * postProcessBeforeInitialization:在初始化之前工作 * postProcessAfterInitialization:在初始化之后工作
Cat.class
package com.dym.bean.dd;import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.stereotype.Component;@Component public class Cat implements InitializingBean,DisposableBean {public Cat(){System.out.println("cat constructor...");}@Overridepublic void destroy() throws Exception {// TODO Auto-generated method stubSystem.out.println("cat...destroy...");}@Overridepublic void afterPropertiesSet() throws Exception {// TODO Auto-generated method stubSystem.out.println("cat...afterPropertiesSet...");} }Dog.class
package com.dym.bean.dd;import javax.annotation.PostConstruct; import javax.annotation.PreDestroy;import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component;@Component public class Dog implements ApplicationContextAware {//@Autowiredprivate ApplicationContext applicationContext;public Dog() {System.out.println("dog constructor...");}//對象創建并賦值之后調用@PostConstructpublic void init() {System.out.println("Dog....@PostConstruct...");}//容器移除對象之前@PreDestroypublic void detory() {System.out.println("Dog....@PreDestroy...");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// TODO Auto-generated method stubthis.applicationContext = applicationContext;} }MyBeanPostProcessor.class
package com.dym.bean.dd;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component;/*** 后置處理器:初始化前后進行處理工作* 將后置處理器加入到容器中*/ @Component public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// TODO Auto-generated method stubSystem.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {// TODO Auto-generated method stubSystem.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);return bean;} }BeanPostProcessor原理
* 遍歷得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization, * 一旦返回null,跳出for循環,不會執行后面的BeanPostProcessor.postProcessorsBeforeInitialization * * BeanPostProcessor原理 * populateBean(beanName, mbd, instanceWrapper);給bean進行屬性賦值 * initializeBean * { * applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); * invokeInitMethods(beanName, wrappedBean, mbd);執行自定義初始化 * applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); *} * Spring底層對 BeanPostProcessor 的使用; * bean賦值,注入其他組件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;總結
以上是生活随笔為你收集整理的Bean的生命周期——init-method和destroy-method - 通过让Bean实现InitializingBean,DisposableBean--BeanPostProcessor的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 给容器中注册组件 || @Scope
- 下一篇: 组件赋值——@Value ---@Pr