ProgramingTip

Spring에서 BeanPostProcessor와 init / destroy 메소드의 차이점은 무엇입니까?

bestdevel 2021. 1. 6. 20:53
반응형

Spring에서 BeanPostProcessor와 init / destroy 메소드의 차이점은 무엇입니까?


이행의 차이 BeanPostProcessor무엇 입니까 인터페이스 및 중 하나를 사용하여 init/ destroy봄의 XML 구성 파일의 방법 속성 또는 구현 InitializingBean/ DisposableBean인터페이스는?


이것은 Container Extension Points 에 대한 Spring 문서에서 매우 명확하게 설명 합니다.

BeanPostProcessor 인터페이스는 자체 인스턴스화 논리, 해결 논리 등을 제공하기 위해 구현할 수있는 방법을 정의합니다. Spring 컨테이너가 Bean의 인스턴스화, 구성 및 초기화를 완료 한 후 일부 사용자 정의를 구현할 하나 이상의 BeanPostProcessor 구현을 수행 할 수 있습니다.

즉, 초기화 postProcessBeforeInitialization메서드 BeanPostProcessor에 정의 된 메서드 는 빈 초기화 호출되고 (이름에서 알 수 있습니다.) postProcessAfterInitialization빈 초기화 후에 호출됩니다.

@PostConstruct, InitializingBean및 user-정의 init메소드 의 차이점 은 이들이 콩 자체에서 정의된다는 것입니다. 순서는 Spring 문서 생명주기 메커니즘 결합 섹션 에서 사용할 수 있습니다 .

따라서 기본적으로 BeanPostProcessor는 다른 bean이 단위로 정의되는 경우 여러 bean에 대한 사용자 정의 인스턴스화 논리를 수행하는 데 사용할 수 있습니다.


위의 답변은 매우 중요한 부분 중 일부를 명확하게 설명합니다.

그 외에도 beanPostProcessor와 init 및 destroy 메소드가 모두 Spring Bean 사이클의 일부라는 것을 이해하는 것도 중요합니다.

BeanPostProcessor 클래스에는 두 가지 방법이 있습니다.

1) postProcess 초기화하기 전에 필요한 작업이 수행 확인하는 데 사용하기 전에 명확하게 알 수 있습니다. 예를 들어 원격 소스 / 서비스에서 특정 속성 파일을로드하거나 데이터를 읽고 싶습니다.

2) postProcessAfterInitialization- 응용 프로그램에 Bean 참조가 제공되기 전에 초기화 후 수행하려는 모든 작업.

다음과 같이 라이프 사이클에서 질문 된 방법의 순서 :

1) BeanPostProcessor.postProcessBeforeInitialization ()

2) 초기화 ()

3) BeanPostProcessor.postProcessAfterInitialization ()

4) 파괴 ()

sysout이있는 간단한 예제를 작성하여이를 확인하고 순서를 확인할 수 있습니다.


그리고 또 하나의 주요 차이점은 InitializingBean, DisposableBean과 관련된 afterPropertiesSet () 및 destory () 메소드가 매개 변수를 허용하지 즉시 반환 유형도 void 사용자 정의에서 구현하지 않습니다. BeanPostProcess 메소드에 오면 postProcessBeforeInitialization (Object bean, String beanName) 및 postProcessAfterInitilization (Object bean, String beanName) 은이 두 개의 변수를 허용하고 Object 유형도 반환됩니다. 전달을 기반으로하는 사용자 정의 로그인 대신 초기화를 사용할 수 있습니다. . 콩 ...

이 두 번의 라이프 사이클 기능에는 Bean 라이프 사이클이 포함되어 있으며 다음은 다음과 같은 라이프 사이클입니다.

1) BeanPostProcessor.postProcessBeforeInitilazation ()

2) @postConstruct 또는 InitializingBean.afterPropertiesSet () 또는
xml / * 에서 정의하는 초기화 메서드 도 여기에서 세 가지 방법을 사용할 수있는 경우 해당 oredr을 ** /

3) BeanPostProcessor.postProcessAfterInitialization ()

4) @preDestroy 또는 DisposibleBean.destroy () 또는 xml / * 에서 정의하는 destroy 메소드 도 여기에서 세 가지 방법을 사용할 수있는 경우 oredr을 ** /


Init 및 Destroy 메소드 는 Spring Bean 라이프 사이클 단계의 일부입니다. 초기화 방법은 콩 인스턴스 후에 실행 될을 구석으로입니다. 유사하게, 파괴 메소드는 빈 종료 전에 실행될 것입니다.

인터페이스 InitializingBean구현을 사용 DisposableBean하거나 @postconstruct주석을 사용 하여이 기능 현관을 구현 @predestroy하거나 <bean>init-methoddestroy-method속성을 선언 할 수 있습니다.

BeanPostProcessor 인터페이스 는 Spring 컨테이너에 의해 수행되는 구성 Pre- 및 Post-Bean 초기화를 수행하려는 경우 프레임 워크의 기능을 확장하는 데 사용됩니다.

: 기본적으로 Spring은 @PostConstruct주석 @PreDestroy인식하지 않습니다 . 이를 활성화 활성화 빈 설정 파일을 등록 CommonAnnotationBeanPostProcessor하거나 지정해야 <context:annotation-config />합니다. 다음 CommonAnnotationBeanPostProcessor주석 BeanPostProcessor에 대한 사전 정의 된 구현입니다. 처럼 :

@RequiredRequiredAnnotationBeanPostProcessor처리 도구를 활성화합니다.
@AutowiredAutowiredAnnotationBeanPostProcessor처리 도구를 활성화 합니다.


위의 모든 답변에 대한 간단한 보충 : 일반적인 논리가있는 경우 빈에 거 삽입, 속성 파일 설정, 설정과 같이 Spring Bean에 보편적으로 적용해야하는 공통 논리가있는 경우 반사를 통해 당신의 콩밭에 가치를; 그 자리를 한 곳에 넣을 수 있습니다. @Override(예 : 인터페이스를 postProcessBeforeInitialization(Object arg0, String arg1)구현하는 경우 BeanPostProcessor); 모든 빈에서 라우팅을 복제하는 대신.


a) 빈 초기화 전에 postProcessBeforeInitialization ()이 호출됩니다.

b) 빈이 초기화되면 Spring 문서에 따라 다음 순서로 다른 메서드가 호출됩니다.

  1. @PostConstruct로 주석 처리 된 메서드
  2. InitializingBean 인터페이스에 의해 정의 된 afterPropertiesSet ()
  3. XML을 통해 정의 된 메소드를 초기화합니다.

가장 큰 차이점은 postProcessBeforeInitialization () 메소드에 초기화가 호출 후 위의 세 메소드가 호출 할 것입니다.

메소드가 완료되면 postProcessAfterInitialization () 메소드가 호출되고 파괴 메소드가 동일한 순서로 호출됩니다.

  1. @PreDestroy로 주석이 달린 메서드

  2. DisposableBean 응용 인터페이스에 의해 정의 된 destroy ()

  3. XML을 통해 정의 된 destroy () 메소드.

참조 URL : https://stackoverflow.com/questions/9862127/what-is-the-difference-between-beanpostprocessor-and-init-destroy-method-in-spri

반응형