봄 콩 수명주기의 단계 분석에 의해 단계

 소개 스프링 빈의 라이프 사이클은 봄에 대한 심층 연구를위한 기초이다, 또한,이 문서는 스프링 빈의 라이프 사이클의 결론을 설명하기 위해 코드 + 그래픽 방법을 어려운 사용합니다,

이 문서는 다음과 명확하게 그림을 설명합니다.

 

 프로젝트 구조와 소스 코드

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

추천

출처www.cnblogs.com/wangjiming/p/11669091.html