답변:
실제로는 차이가 없다고 생각하지만 작동 방식에는 우선 순위가 있습니다. @PostConstruct
, init-method
BeanPostProcessors입니다.
@PostConstruct
JSR-250 주석 init-method
이며 Spring의 초기화 방법입니다.@PostConstruct
메서드 가있는 경우 초기화 메서드가 호출되기 전에 먼저 호출됩니다.afterPropertiesSet
경우 먼저 @PostConstruct
호출 된 afterPropertiesSet
다음 init-method
.자세한 정보는 Spring의 참조 문서를 확인하십시오 .
JSR 250 사양 이전에는 xml의 init-method 사용이 선호되는 방식이었습니다. 스프링 특정 클래스 / 주석에서 자바 클래스 (빈)를 분리하므로 스프링 인프라 빈에 의존 할 필요가없는 라이브러리를 구축하는 경우 init-method를 사용하는 것이 선호되었습니다. 생성 방법 중 u는 초기화 방법으로 호출해야하는 방법을 지정할 수 있습니다.
이제 Java EE에 JSR 250 사양이 도입되고 이러한 주석이 스프링 지원되므로 스프링 프레임 워크에 대한 종속성이 어느 정도 감소했습니다.
그러나 나는 이러한 것들을 추가하면 코드의 가독성이 높아진다는 것을 인정해야하므로 두 가지 접근 방식 모두 장단점이 있습니다.
실제 차이는 없습니다. 시스템 구성을 선호하는 방식에 따라 다르며 이는 개인적 선택의 문제입니다. 나 자신 @PostConstruct
은 내 자신의 코드에 주석 을 사용하는 것을 선호하며 (빈은 메서드가 호출 된 후에 만 올바르게 구성되므로) init-method
Spring을 인식하지 않는 라이브러리에서 Bean을 인스턴스화 할 때 사용합니다 (물론 주석을 적용 할 수 없습니다!) 그러나 나는 어떤 식 으로든 모든 것을하고 싶어하는 사람들을 완전히 이해할 수 있습니다.
@postconstruct는 봄의 일부가 아닙니다. javax 패키지의 일부입니다. 둘 다 동일합니다. init-method를 사용하여 xml 파일에 추가해야합니다. @postconstruct를 사용하는 경우 xml에 추가 할 필요가 없습니다. 아래 기사를 확인하십시오.
아래의 Bean Creation Life-Cycle Callback 다이어그램에서 볼 수 있습니다 .
이 3 단계는 Bean Creation Life-Cycle 콜백에서 발생합니다.
@PostConstruct
불릴 것이라고 언급 됩니다.InitializingBean
구현 한 후 afterPropertiesSet()
호출됩니다.init-method
있거나 @Bean(initmethod="..")
init 메소드를 호출합니다.이 다이어그램은 Pro Spring 5 : Spring 프레임 워크 및 도구에 대한 심층 가이드 에서 가져온 것입니다 .
이 수도 의 차이 @PostConstruct
및 init-method
때문에 @PostConstruct
에서 처리 postProcessAfterInitialization
콩 초기화 (의 상 AbstractAutowireCapableBeanFactory.initializeBean()
에 의한 방법) CommonAnnotationBeanPostProcessor
동안, init
방법의 완료 후에 호출되는 postProcessBeforeInitialization
단계 (이 문제에 대한과의 시작하기 전에 postProcessAfterInitialization
상)을.
편집 : 그래서, 순서는 1) postProcessBeforeInitialization
단계, 2) init
메서드가 호출되고, 3) 메서드 postProcessAfterInitialization
를 호출 @PostConstruct
하는 단계입니다.
(부수적으로, 수락 된 답변의 진술
@PostConstruct, init-method는 BeanPostProcessors입니다.
는 정확 하지 않습니다.는 , 메서드에 @PostConstruct
의해 처리 되지 않습니다.)BeanPostProcessor
init
이 될 것입니다 차이 경우 일부 (잠재적으로 사용자 정의) BeanPostProcessor
로 구성되어있는, ( Ordered.getOrder()
) 후에 실행되는 CommonAnnotationBeanPostProcessor
자사의 심각한 뭔가하고있다 postProcessBeforeInitialization
방법.
이 '노 의 기본 봄 구성에 차이 BeanPostProcessors
모든 때문에 BeanPostProcessors
후에 실행되도록 구성되어있는가 CommonAnnotationBeanPostProcessor
에 아무것도하지 않는 postProcessBeforeInitialization
방법.
결론적으로 받아 들여진 대답과 그와 유사한 것이 맞습니다. 99 %의 경우에서이 게시물은 "악마가 세부 사항에 있습니다"라는 개념에 경의를 표하는 것입니다.
전체 코드 : 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 등록 취소
중 ...
MyComponent in preDestroy : [Magic]