복붙노트

[SPRING] Spring @PostConstruct 대 init-method 속성

SPRING

Spring @PostConstruct 대 init-method 속성

@PostConstruct 어노테이션을 사용하는 것과 Spring XML 설정에서 init-method와 같은 메소드를 선언하는 것 사이에 어떤 차이가 있습니까?

해결법

  1. ==============================

    1.실제로 어떤 차이가 있다고 생각하지 않지만 그들이 일하는 방식에 우선 순위가 있습니다. @PostConstruct, init-method는 BeanPostProcessors입니다.

    실제로 어떤 차이가 있다고 생각하지 않지만 그들이 일하는 방식에 우선 순위가 있습니다. @PostConstruct, init-method는 BeanPostProcessors입니다.

    자세한 정보는 Spring의 참조 문서를 확인하면된다.

  2. ==============================

    2.진정한 차이는 없습니다. 그것은 시스템 구성을 선호하는 방법에 달려 있으며, 이는 개인 선택의 문제입니다. 저 자신, @PostConstruct 주석을 사용하는 것을 선호합니다 (메소드가 호출 된 후에 만 ​​Bean이 올바르게 구성되므로), Spring을 인식하지 않는 라이브러리에서 Bean을 인스턴스화 할 때 init 메소드를 사용합니다 (주석을 거기에 적용 할 수 없음). , 당연히!)하지만 나는 모든 것을 한 방향으로 또는 다른 방향으로하고 싶어하는 사람들을 완전히 이해할 수 있습니다.

    진정한 차이는 없습니다. 그것은 시스템 구성을 선호하는 방법에 달려 있으며, 이는 개인 선택의 문제입니다. 저 자신, @PostConstruct 주석을 사용하는 것을 선호합니다 (메소드가 호출 된 후에 만 ​​Bean이 올바르게 구성되므로), Spring을 인식하지 않는 라이브러리에서 Bean을 인스턴스화 할 때 init 메소드를 사용합니다 (주석을 거기에 적용 할 수 없음). , 당연히!)하지만 나는 모든 것을 한 방향으로 또는 다른 방향으로하고 싶어하는 사람들을 완전히 이해할 수 있습니다.

  3. ==============================

    3.@postconstruct는 스프링의 일부가 아닙니다. javax 패키지의 일부입니다. 둘 다 동일합니다. 우리는 xml 파일에 추가해야하는 init 메소드를 사용합니다. @postconstruct를 사용하면 xml에 추가 할 필요가 없습니다. 아래의 기사를 확인하십시오.

    @postconstruct는 스프링의 일부가 아닙니다. javax 패키지의 일부입니다. 둘 다 동일합니다. 우리는 xml 파일에 추가해야하는 init 메소드를 사용합니다. @postconstruct를 사용하면 xml에 추가 할 필요가 없습니다. 아래의 기사를 확인하십시오.

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

  4. ==============================

    4.전체 코드는 다음과 같습니다. https://github.com/wkaczurba/so8519187 (spring-boot)

    전체 코드는 다음과 같습니다. 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
        }
    }
    

    우리를 얻는다 :

  5. ==============================

    5.@PostConstruct는 CommonAnnotationBeanPostProcessor에 의해 bean 초기화 (AbstractAutowireCapableBeanFactory.initializeBean () 메소드)의 postProcessAfterInitialization 단계에서 처리되고, init-method는 postProcessBeforeInitialization 단계가 완료된 후에 호출됩니다 (그리고, forPostConstruct와 init-method 사이에 차이가있을 수 있습니다. 이 문제는 postProcessAfterInitialization 단계가 시작되기 전에). (그러므로, 수용된 대답의 진술

    @PostConstruct는 CommonAnnotationBeanPostProcessor에 의해 bean 초기화 (AbstractAutowireCapableBeanFactory.initializeBean () 메소드)의 postProcessAfterInitialization 단계에서 처리되고, init-method는 postProcessBeforeInitialization 단계가 완료된 후에 호출됩니다 (그리고, forPostConstruct와 init-method 사이에 차이가있을 수 있습니다. 이 문제는 postProcessAfterInitialization 단계가 시작되기 전에). (그러므로, 수용된 대답의 진술

    @PostConstruct는 BeanPostProcessor에 의해 처리되고, init-method는 처리되지 않습니다.) CommonAnnotationBeanPostProcessor 다음에 실행되도록 구성된 (Ordered.getOrder ()) BeanPostProcessor가 postProcessBeforeInitialization 메소드에서 심각한 작업을 수행하고 있다면 (잠재적으로 사용자 정의 된) BeanPostProcessor가 변경 될 수 있습니다. CommonAnnotationBeanPostProcessor 다음에 실행되도록 구성된 모든 BeanPostProcessors는 postProcessBeforeInitialization 메소드에서 아무 것도하지 않기 때문에 BeanPostProcessors의 기본 Spring 구성과 차이가 없다. 결론적으로, 받아 들여진 대답과 비슷한 내용은 99 %의 경우에 있으며,이 게시물은 단지 "악마가 세부 사항에 있음"이라는 개념에 찬사를 보내는 것입니다.

  6. from https://stackoverflow.com/questions/8519187/spring-postconstruct-vs-init-method-attribute by cc-by-sa and MIT license