Java에서 가장 인기 있고 강력한 경량 프레임 워크로서 Spring은 프로그래머들에 의해 따뜻하게 환영되었습니다. 스프링 콩의 수명주기를 정확하게 이해해야합니다. 우리는 일반적으로 ApplicationContext를 스프링 컨테이너로 사용합니다. 여기서 우리는 또한 ApplicationContext에서 Bean의 수명주기에 대해 이야기하고 있습니다. 실제로 BeanFactory는 비슷하지만 프로세서는 수동으로 등록해야합니다.
1. 수명주기 흐름도 :
스프링 콩의 전체 수명주기는 스프링 컨테이너가 결국 콩을 파괴 할 때까지 스프링 컨테이너를 만드는 것으로 시작합니다.
컨테이너가 위의 다양한 인터페이스를 등록하는 경우 프로그램은 위의 프로세스에 따라 수행됩니다. 각 인터페이스의 기능은 아래에 자세히 설명됩니다.
2. 다양한 인터페이스 방법의 분류
Bean의 전체 수명주기는 다양한 방법 호출을 거쳐 다음 범주로 나눌 수 있습니다.
1. Bean의 자체 방법 : 여기에는 Bean 자체가 호출하는 메소드와 구성 파일의 초기 및 파괴 방법을 통해 지정된 메소드가 포함됩니다.
2. Bean 레벨 수명주기 인터페이스 방법 : 여기에는 Beannameaware, BeanFactoryAware, 초기화 및 DiposableBean과 같은 인터페이스 방법이 포함됩니다.
3. 컨테이너 수준의 수명주기 인터페이스 방법 : 여기에는 InstantiationAwareBeanPostProcessor 및 BeanPostProcessor의 두 가지 인터페이스 구현이 포함됩니다. 구현 클래스를 일반적으로 "후 처리기"라고합니다.
4. Factory PostProcessor 인터페이스 방법 : 여기에는 SpecipingEnabler, ConfigurationClassPostProcessor, CustomAutowIreconFigurer 및 기타 매우 유용한 Factory PostProcessor 인터페이스 방법이 포함됩니다. 공장 후 프로세서도 컨테이너 수준입니다. 컨텍스트 어셈블리 구성 파일을 적용한 후 즉시 호출됩니다.
3. 데모
간단한 스프링 콩으로 스프링 콩의 수명주기를 시연합시다.
1. 우선, 그것은 단순한 스프링 콩으로, 콩의 자체 방법과 콩 수준의 수명주기 인터페이스 방법이라고 부릅니다. 시연의 편의를 위해 Beannameaware, Beanfactoryaware, 초기화 및 쌍극자의 네 가지 인터페이스를 구현합니다. 구성 파일에서 <ean>의 초기 방법 및 파괴 방법에 해당하는 동시에 두 가지 방법이 있습니다. 다음과 같이 :
패키지 SpringBeantest; import org.springframework.beans.beansexception; import org.springframework.bean.beans.beanfactory; import org.springframework.beans.beanfactoryaware; import org.springframework.beans.bean.beannameaware; org.springframework.bean.beans.factory.disposablebean; import org.springframework.beans.factory.initializingbean;/** * @author qsk */public class persone beanctoryaware, beannameaware, 초기화, 처분 가능한 문자열 이름; 개인 문자열 주소; 개인 int 전화; 비공개 멍청한 beanfactory; 개인 문자열 beanname; public person () {system.out.println ( "【생성자】 콜 사람의 생성자 인스턴스화"); } public String getName () {return name; } public void setName (문자열 이름) {System.out.println ( "【주입 속성】 주입 속성 이름"); this.name = 이름; } public String getAddress () {return address; } public void setAddress (문자열 주소) {System.out.println ( "【주입 속성】 주입 속성 주소"); address = 주소; } public int getphone () {반환 전화; } public void setphone (int phone) {System.out.println ( "【주입 속성】 주입 속성 전화"); this.phone = 전화; } @override public String toString () {return "person [address =" + address + ", name =" + name + ", 폰 =" + 폰 + "]; } // 이것은 BeanClyAware 인터페이스 메소드 @override public void setbeanfactory (beanfactory arg0)가 beansexception {system.out .println ( "【beanfactoryaware interface】 call beanfactoryaware.setbeanfactory ()"; this.beanfactory = arg0; } // 이것은 beannameaware 인터페이스 메소드 @override public void setbeanname (String arg0) {system.out.println ( "【beannameaware interface】 call beannameaware.setbeanname ()"); this.beanname = arg0; } // 이것은 초기형 인터페이스 메소드 @override public void afterProperTiesset ()를 예외 {system.out .println ( "【초기화 interface hallizing initializingBean.AfTerProperTiesset ()"; } // 이것은 diposiblebean 인터페이스 메소드 @override public void destroy ()가 예외 {system.out.println ( "【diposiblebean interface】 diposiblebean.destory ()"); } // <ean> public void myinit () {system.out.println의 초기화 속성을 통해 지정된 초기화 메소드 ( "【init-method】 <eanb>"의 초기화 속성에 지정된 초기화 방법을 호출); } // <ean> public void myDestory () {system.out.println의 파괴 메드 속성에 의해 지정된 초기화 방법 ( "【Destroy-method】 <eanb>의 파괴 메드 속성에 의해 지정된 초기화 방법"); }}2. 다음은 BeanPostProcessor 인터페이스의 방법을 보여주는 것입니다.
패키지 SpringBeantest; import org.springframework.beans.beansexception; import org.springframework.beans.config.config.beanpostprocessor; public class mybeanpostprocessor는 beanpostprocessor {public mybeanpostprocessor () {super (); System.out.println ( "이것은 BeanPostProcessor 구현 클래스 생성자 !!"); // TODO 자동 생성 생성자 스텁} @Override public Object PostProcessAfterinitialization (Object Arg0, String Arg1)은 Beansexception을 던졌습니다. 리턴 arg0; } @override public object postprocessbeforeinitialization (Object Arg0, String Arg1)은 beansexception {system.out .println ( "beanpostprocessor interface method postprocessbeforeinitialization이 속성을 변경하십시오!"); 리턴 arg0; }}위에서 언급 한 바와 같이, BeanPostProcessor 인터페이스는 2 가지 방법 후 프로세스 사후 감소 및 후 프로세스 전신 이니 니닝 화를 포함한다. 이 두 가지 방법의 첫 번째 매개 변수는 처리 할 Bean 객체이며 두 번째 매개 변수는 Bean의 이름입니다. 반환 값은 또한 처리 할 Bean 객체입니다. 여기에주의를 기울이십시오.
3. InstantiationAwareBeanPostprocessor 인터페이스는 본질적으로 BeanPostProcessor의 하위 인터페이스입니다. 일반적으로, 우리는 Spring이 제공하는 어댑터 클래스 InstantiationAwareBeanPostprocessor 어댑터를 다음과 같이 사용합니다.
package springBeanTest;import java.beans.PropertyDescriptor;import org.springframework.beans.BeansException;import org.springframework.beans.PropertyValues;import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;public class myInstantiationAwareBeanPostProcessor는 InstantiationAwareBeanPostProcessOradapter를 확장합니다. System.out .println ( "이것은 InstantiationAwareBeanPostProcessOradapter 구현 클래스 생성자 !!"); } // 호출 @override public object postprocessbebeforeinstantiation (class beanclass, string beanname)은 beansexception {system.out .println ( "instantiationAwareBeanPostProcessor 호출 postProcessBeforeInstantiation method"); 널 리턴; } // 인터페이스 메소드, @override public 객체 postprocessafterinitialization (객체 bean, String beanname)이 beansexception {system.out .println ( "instantiationAwareBeanPostProcessor 호출 postprocessAfterinitialization method"); 귀환 콩; } // 호출 @override public propertyValues postProcessPropertyValues (PropertionValues PVS, PropertyDescriptor [] PDS, Object Bean, String Beanname)는 beansexception {system.out .println ( "InstantiationAwareBeanPostProcessor Call PostProcessPropertyValues Method"); 반환 PV; }}이를위한 3 가지 방법이 있으며, 두 번째 방법 인 후 프로세스 감독관은 BeanPostProcessor의 방법을 다시 작성하는 것입니다. 세 번째 방법 인 postprocesspropertyvalues는 속성을 작동하는 데 사용되며 반환 값은 속성 값 개체이어야합니다.
4. 다음과 같이 공장 후 프로세서 인터페이스 방법을 시연합니다.
패키지 springbeantest; import org.springframework.beans.beansexception; import org.springframework.beans.factory.config.beandefinition; import org.spramframework.beans.config.config.beanctorypostprocessor; import org.springframework.bean.beans.factory.config.configurablelistablebeanfactory; public class mybeanfactorypostprocessor는 beanfactorypostprocessor를 구현합니다. System.out.println ( "이것은 BeanFactoryPostProcessor 구현 클래스 생성자 !!"); } @override public void postprocessbeanfactory (configurablelistablebeanfactory arg0)는 beansexception {system.out .println ( "beanfactorypostprocessor 호출 postprocessbeanfactory method"); beandefinition bd = arg0.getBeanDefinition ( "person"); bd.getPropertyValues (). addPropertyValue ( "Phone", "110"); }}5. 구성 파일은 다음과 같습니다. beans.xml은 매우 간단합니다. ApplicationContext를 사용하는 경우 프로세서를 수동으로 등록 할 필요가 없습니다.
<? xml 버전 = "1.0"alcoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans"xmlns : xsi = "http://ww.w.w3.org/2001/xmlschema-instance" xmlns : p = "http://www.springframework.org/schema/p"xmlns : aop = "http://www.springframework.org/schema/aop"xmlns : tx = "http://www.springfrfamwork.org/schema/tx" xsi : schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.xsd"> <bean id = "beanpostprocessor"> <ba id = "instationaleaweanposcessor" </bean> <bean id = "beanfactorypostprocessor"> </bean> <bean id = "person"init-method = "myinit"destrove-method = "myDestory"scope = "singleton"p : name = "Zhang San"p : address = "guangzhou"p : phone = "15900000000"/> </beans>
6. 다음을 테스트하십시오.
패키지 SpringBeantest; import org.springframework.context.applicationcontext; import org.springframework.context.support.classpathxmlapplicationcontext; public static void main (String [] args) {system.out.println ( "컨테이너 시작"); ApplicationContext factory = new ClassPathXmlApplicationContext ( "SpringBeantest/Beans.xml"); System.out.println ( "컨테이너 초기화가 성공적으로"); // preson을 받고 사람을 사용합니다. person = factory.getBean ( "person", person.class); System.out.println (사람); System.out.println (사람); System.out.println ( "지금 컨테이너를 닫아 시작하십시오!"); ((classPathXmlApplicationContext) factory) .registerShutdownHook (); }}실제로 AbstractApplicationContext 인 후크 메소드를 사용하여 컨테이너를 닫습니다.
결과를 살펴 보겠습니다.
현재 컨테이너 초기화 시작 2014-5-18 15:46:20 org.springframework.context.support.abstractApplicationContext PrepareReResh 정보 : 새로 고침 org.springframework.context.support.classPathXmlApplicationContext@19A0C7C : Sun May 18 15:46:20 CST 2014]; 컨텍스트의 루트 Hierarchy2014-5-18 15:46:20 org.springframework.beans.beans.beans.xml.xmlbeandefinitionreader loadbeandefinitions 정보 : 클래스 경로 리소스에서 XML Bean 정의로드 [SpringBeantest/Beans.xml] 이것은 BeanFactoryPosts Processor에서 XML Bean 정의로드! ! BeanFactoryPostProcessor 호출 PostProcessBeanFactory Method BeanPostProcessor 구현 클래스 생성자입니다! ! 이것은 InstantiationAwareBeanPostProcessOradapter 구현 클래스 생성자입니다! ! 2014-5-18 15:46:20 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletonsInformation: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@9934d4: defining beans [BeanPostProcessor, InstantiationAwareBeanPostProcessor, BeanFactoryPostProcessor, Person]; Factory HierarchyInstantiationAwarebeanPostsors의 루트 호출 후 프로세스 비 전신 연구 방법 [생성자] 호출 사람의 생성자 instantiationAwareBeanPostProcessor 호출 postprocesspropertyValues 메소드 [주입 속성] 주입 속성 [주입 속성 속성] 속성을 주입합니다. BeannameAware.setBeanName () [BeanFactoryAware Interface] Calling BeanFactoryAware.SetBeanFaceSor () BeanPostProcessor Interface Method PostProcessBeforeInitialization Attribute를 변경합니다! [초기형 인터페이스] 호출 초기화 비안. InstantiationAwareBeanPostprocessor는 후 프로세스 감독관을 호출합니다. 컨테이너는 성공적으로 초기화됩니다. 사람 [주소 = 광저우, 이름 = Zhang San, 전화 = 110] 이제 컨테이너를 닫기 시작하십시오! dosposiblebean 인터페이스】 diposiblebean.destory () call destrove-method】 <bean>의 파괴 방법 속성에 의해 지정된 초기화 방법을 호출하십시오.
위는 Java Spring Bean의 수명주기에 대한 정보를 편집 한 것입니다. 우리는 향후 관련 정보를 계속 추가 할 것입니다. 이 사이트를 지원 해주셔서 감사합니다!