소개 스프링 빈의 라이프 사이클은 봄에 대한 심층 연구를위한 기초이다, 또한,이 문서는 스프링 빈의 라이프 사이클의 결론을 설명하기 위해 코드 + 그래픽 방법을 어려운 사용합니다,
이 문서는 다음과 명확하게 그림을 설명합니다.
프로젝트 구조와 소스 코드
1. 디렉토리 구조
2.applicationContext.xml
<? XML 버젼 = "1.0"인코딩 = "UTF-8" ?> < 콩 의 xmlns = "http://www.springframework.org/schema/beans" 의 xmlns :이 xsi = "http://www.w3.org/2001 / 된 XMLSchema 인스턴스 " XSI :의 schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd " > < 빈 클래스 ="COM .demo.dao.UserDao " ID ="userDao " 범위 ="단일 " INIT 메소드 ="myInit " 파괴 메소드 ="myDestroy " > </> </ 콩 > < 빈 클래스 = "com.demo.dao.MyBeanPostProcessor" ID = "myBeanPostProcessor" /> </ 콩 >
3.UserDao.java
패키지 com.demo.dao; 수입 org.springframework.beans.BeansException; 가져 org.springframework.beans.factory *. ; 수입 org.springframework.beans.factory.config.BeanPostProcessor; 수입 org.springframework.context.ApplicationContext; 수입 org.springframework.context.ApplicationContextAware; 수입 org.apache.log4j.Logger; 공공 클래스 UserDao는 구현 BeanNameAware, BeanFactoryAware와, ApplicationContextAware, InitializingBean 표시, DisposableBean 표시 { 개인 문자열 아이디; 개인 의 INT 카운트 = 0 ; 공용 문자열이 때 getUserName () { 돌아가 상기 아이디 } // 2. 등록 주입 입성이 자명 공개 공극 setUserName (문자열 사용자 이름) { COUNT ++ ; COUNT에서 System.out.println ( + "속성을 사용자 이름을 주입 ="+ 사용자 명 ) 은이 .userName는 = ; 사용자 이름을 } // 인스턴스 생성자 호출에 대한 인수 1. 생성자를 공개 UserDao () { COUNT를 ++ ; 에서 System.out.println을 (COUNT + ": UserDao가 생성자를 호출 () " ); } // 3. BeanNameAware이 ID는 빈 획득, 구현 공공 무효를setBeanName (문자열 S) { COUNT ++ ; 에서 System.out.println (COUNT : + + "setBeanName을 (호출) ID 콩, 콩 ID = 가져옵니다" ; S를) } // 4. 빈 공장을 획득, BeanFactoryAware와 구현 공공 무효 setBeanFactory을 (BeanFactory로의 BeanFactory가) 발생 BeansException { COUNT를 ++ ; 에서 System.out.println을 (COUNT + ": setBeanFactory ()를 호출 콩 식물을 가져옵니다 BeanFactory에 ="+ BeanFactory에); } // 5.는 획득 ApplicationContextAware, 콩 컨텍스트 구현 공공 무효 setApplicationContext을 (애플리케이션 컨텍스트 애플리케이션 컨텍스트)가 발생 BeansException을 { COUNT );++ ; 에서 System.out.println (COUNT : + + "setApplicationContext을 (전화가) 콩 컨텍스트의 ApplicationContext = 가져옵니다" ;의 ApplicationContext) } // 6.이 afterPropertiesSet 획득, InitializingBean 표시를 구현 공공 무효 afterPropertiesSet ()가 발생 예외에게 { COUNT를 ++ ; 에서 System.out.println (COUNT : "afterPropertiesSet ()를 호출"+ ) } // ) (사용자 정의 초기화 방법 MyInit 7. 공공 무효 MyInit () { COUNT ++ ; 에서 System.out.println (COUNT + ": 호출 사용자 정의 MyInit () " } //제 DisposableBean 표시를 달성 소멸 () 취득 공개 공극 (가)) (파괴 발생 예외 { COUNT를 ++ ] 에서 System.out.println을 (COUNT + "다음 () 파괴 ' ); } // 제 파괴 맞춤 myDestroy 방법 () 공개 무효 myDestroy () { COUNT ++ ; 에서 System.out.println (COUNT + ": 사용자가이) (파괴 호출" ); } }
4.MyBeanPostProcessor.java
패키지 com.demo.dao; 수입 org.springframework.beans.BeansException; 수입 org.springframework.beans.factory.config.BeanPostProcessor; 공공 클래스 MyBeanPostProcessor는 구현 BeanPostProcessor { 공공 개체 postProcessBeforeInitialization을 (객체 콩, 문자열 beanName에) 발생 BeansException { 에서 System.out.println ( "=====调用postProcessBeforeInitialization () =====" ;이) 반환 콩; } 공공 객체 postProcessAfterInitialization (객체 콩, 문자열 beanName에)가 발생 BeansException을 { 에서 System.out.println을 ("=====调用postProcessAfterInitialization () =====" ); 반환 콩; } }
두 테스트 코드와 테스트 결과
1.test.java
패키지 com.demo.test; 수입 com.demo.dao.UserDao; 수입 org.junit.Test; 수입 org.springframework.context.support.AbstractApplicationContext; 수입 org.springframework.context.support.ClassPathXmlApplicationContext; 공공 클래스 MYTEST { @Test 공공 무효 시험 () { // 定义容器并初始化 // 의 ApplicationContext ApplicationContext를 = 새로운 ClassPathXmlApplicationContext ( "applicationContext.xml"); AbstractApplicationContext의 ApplicationContext = 새로운 ClassPathXmlApplicationContext ( "applicationContext.xml" ); applicationContext.getBean (. UserDao에 클래스 ); // 메소드를 파괴, 밀폐 용기에 있어야하는 것은 호출 ) applicationContext.registerShutdownHook ( } }
2. 테스트 결과
세 가지의 분석
다음과 같이 위의 테스트 결과와 함께, 콩 라이프 사이클 프로세스는 다음과 같습니다
1. 조립 콩
빈의 라이프 사이클의 첫 번째 부분에 대한 콩 어셈블리. 소위 콩 조립체 빈 Java 오브젝트로 변환하는 과정을 말한다. 이 예에서, UserDao.jave와 콩에 MyBeanPostProcessor XML 방식.
참고 예 XML, 자바 코드의 실시 예에서, 자동 조립 및 혼합 조립 방법 : 스프링 장착 프레임 십자 빈을 지원
2.로드 및 인스턴스화 applicationContext.xml
로드 및 인스턴스화 콩 빈은 수명주기의 두 번째 부분이다. 기다리지 않고 빈이 단독 인 경우,이 처리는, 오브젝트를 인스턴스화하고,로드 ClassPathXmlApplicationContext 본원 예시 () 및
동일하지 않은 프로토 타입 객체를 인스턴스화 할 때 applicationContext.getBean ()는 빈을 가져옵니다 호출합니다.
3. 속성 주입
빈주기 3 측면 반사 모드 주입 콩 사출 빈 속성.
4. 구현 BeanNameAware 획득 빈 ID
절차는 빈의 라이프 사이클의 네 번째 부분, 인터페이스를 구현, 당신은 빈 ID를 얻을 수 있습니다
5. 콩 식물을 획득, BeanFactoryAware와 구현
절차는 빈의 라이프 사이클의 다섯 번째 부분, 콩 식물은 BeanFactoryAware와 구현에 인수
6. ApplicationContextAware를 구현 사용 컨텍스트를 얻을
该过程为bean生命周期第六环节,通过实现ApplicationContextAware接口,获取bean上下文
7.调用Bean后置处理器,before
该过程为bean生命周期第七环节,通过实现后置处理器BeanPostProcessor获取before和after,该过程是通过AOP方式实现的,在before和after之间,发生如下8,9过程。
8.实现InitializingBean的afterPropertiesSet(),获取初始化方法
该过程为bean生命周期第八环节,通过实现InitializingBean,获取afterPropertiesSet()
9.调用自定义初始化方法,init-method
该过程为bean生命周期第九环节,实现自定义初始化方法
10.调用Bean后置处理器after
该过程为bean生命周期第十环节,后置处理器最后环节
11.关闭容器AbstractApplicationContext.registerShutDownHook()
该环节为bean生命周期第十一环节,关闭容器
12.调用DisposableBean的destroy()
该过程为bean生命周期第十二环节,实现DisposableBean接口,调用destroy()
13.调用定制化销毁方法destroy-method
该过程为bean生命周期最后环节,调用自定义销毁方法destroy-method
三 版权区
- 转载博客,必须注明博客出处
- 博主网址:http://www.cnblogs.com/wangjiming/
- 如您有新想法,欢迎提出,邮箱:[email protected]
- 专业.NET之家技术QQ群:490539956
- 专业化Java之家QQ群:924412846
- 有问必答QQ群:2098469527
- 一对一技术辅导QQ:2098469527