IT

Spring @PostConstruct 대 init-method 속성

lottoking 2020. 9. 3. 20:39
반응형

Spring @PostConstruct 대 init-method 속성


@PostConstruct주석 사용 하는 것과 init-methodSpring XML 구성에서 와 같은 방법을 선언하는 것 사이 에 차이점이 있습니까?


실제로는 차이가 있다고 생각하지만 방식은 우선 순위가 있습니다. @PostConstruct, init-methodBeanPostProcessors입니다.

  1. @PostConstructJSR-250 주석 init-method이며 Spring의 초기화 방법입니다.
  2. @PostConstruct메서드 전에 먼저 초기화 메서드가 호출되기 전에 먼저 호출됩니다.
  3. 콩이 InitializingBean 표시 구현 하고을 재정의을하는 afterPropertiesSet경우 먼저 @PostConstruct호출 된 afterPropertiesSet다음 init-method.

자세한 정보는 Spring의 참조 문서를 확인하십시오 .

JSR 250 사양 이전에는 xml의 init-method 사용이 선호되는 방식이었습니다. 스프링 특정 클래스 / 주석에서 자바 클래스 (빈)를 사용하여 스프링 인프라 빈에 의존 할 필요가없는 라이브러리를 구축하는 경우 init-method를 사용하는 것이 선호됩니다. 생성 방법 중 u는 초기화 방법으로 호출해야하는 방법을 수 있습니다.

이제 Java EE에 JSR 250 사양이 도입되고 주석이 스프링 지원 스프링 프레임 워크에 대한 어느 정도 감소했습니다.

그러나 나는 모두 제공되는 추가하면 코드의 가독성이 추가되는 것을 인정해야 두 가지 접근 방식 장단점이 있습니다.


실제 차이는 없습니다. 시스템 구성을 선호하는 방식에 따라 다르며 이는 개인적 선택의 문제입니다. 나 자신 @PostConstruct은 내 자신의 코드에 주석 을 사용하는 것을 선호하며 (빈은 메서드가 호출 된 후에 만 ​​올바르게 구성 메시지) init-methodSpring을 인식하지 않는 라이브러리에서 Bean을 인스턴스화 할 사용합니다 (물론 주석을 적용 할 수 없습니다!) 그러나 나는 어떤 식 으로든 모든 것을 제거하고 싶어합니다.


@postconstruct는 봄의 일부가 아닙니다. javax 패키지의 일부입니다. 둘 다 동일합니다. init-method를 사용하여 xml 파일에 추가해야합니다. @postconstruct를 사용하는 경우 xml에 추가 할 필요가 없습니다. 아래 기사를 확인하십시오.

http://answersz.com/spring-postconstruct-and-predestroy/


전체 코드 : https://github.com/wkaczurba/so8519187 ( spring-boot )

주석 사용 :

@Slf4j
@Component
public class MyComponent implements InitializingBean {

    @Value("${mycomponent.value:Magic}")
    public String value;

    public MyComponent() {
        log.info("MyComponent in constructor: [{}]", value); // (0) displays: Null
    }

    @PostConstruct
    public void postConstruct() {
        log.info("MyComponent in postConstruct: [{}]", value); // (1) displays: Magic
    }

    @Override // init-method; overrides InitializingBean.afterPropertiesSet()
    public void afterPropertiesSet() {
        log.info("MyComponent in afterPropertiesSet: [{}]", value);  // (2) displays: Magic
    }   

    @PreDestroy
    public void preDestroy() {
        log.info("MyComponent in preDestroy: [{}]", value); // (3) displays: Magic
    }
}

우리를 가져옵니다 :

org.springframework.context 새로 고침 중 ...

MyComponent in constructor : [null]
MyComponent in postConstruct : [Magic]
MyComponent in afterPropertiesSet : [Magic]
...

시작시 JMX 노출을위한 Bean 등록
0.561 초에 DemoApplication 시작 (JVM 1.011 실행)
org.springframework.context ... 종료시 JMX 노출 Bean 등록 취소

중 ...
PreDestroy 내 MyComponent : [Magic]


와 (과) 는 빈 초기화 ( 메소드) 단계 에서에서 처리되는 반면, 단계 완료 후 (이 문제의 경우 단계 시작 전에) 호출 되기 때문에 차이 있을 수 있습니다 . (따라서 수락 된 답변의 진술@PostConstructinit-method@PostConstructpostProcessAfterInitializationAbstractAutowireCapableBeanFactory.initializeBean()CommonAnnotationBeanPostProcessorinit-methodpostProcessBeforeInitializationpostProcessAfterInitialization

@PostConstruct, init-method는 BeanPostProcessors입니다.

아주 정확하지 : @PostConstructa로 처리된다 BeanPostProcessor, init-method아니다).
될 것입니다 일부 (잠재적으로 사용자 정의) 경우 차이 BeanPostProcessor, 어떤 구성되어있다 ( Ordered.getOrder()) 후에 실행되는 CommonAnnotationBeanPostProcessor자사의 심각한 뭔가하고있다 postProcessBeforeInitialization방법.
'노 의 기본 봄 구성에 차이 BeanPostProcessors모든 때문에 BeanPostProcessors후에 실행되도록 구성되어있는가 CommonAnnotationBeanPostProcessor에 아무것도하지 않는 postProcessBeforeInitialization방법.
결론적으로 받아 들여진 대답과 그와 유사한 것이 맞습니다. 99 %의 사례에서이 게시물은 "악마가 세부 사항에 있습니다"라는 개념에 경의를 표하는 것입니다.


아래의 Bean Creation Life-Cycle Callback 다이어그램에서 볼 수 있습니다 .

빈 생성 라이프 사이클 콜백

이 3 단계는 Bean Creation Life-Cycle 콜백에서 발생합니다.

  1. @PostConstruct불릴 것이라고 언급 됩니다.
  2. 경우 InitializingBean구현 한 후 afterPropertiesSet()호출됩니다.
  3. 빈 정의에 포함되어 init-method있거나 @Bean(initmethod="..")init 메소드를 호출합니다.

이 다이어그램은 Pro Spring 5 에서 가져온 것입니다. Spring 프레임 워크 및 도구에 대한 심층 가이드

참고 URL : https://stackoverflow.com/questions/8519187/spring-postconstruct-vs-init-method-attribute

반응형