[SPRING] Spring @PostConstruct 대 init-method 속성
SPRINGSpring @PostConstruct 대 init-method 속성
@PostConstruct 어노테이션을 사용하는 것과 Spring XML 설정에서 init-method와 같은 메소드를 선언하는 것 사이에 어떤 차이가 있습니까?
해결법
-
==============================
1.실제로 어떤 차이가 있다고 생각하지 않지만 그들이 일하는 방식에 우선 순위가 있습니다. @PostConstruct, init-method는 BeanPostProcessors입니다.
실제로 어떤 차이가 있다고 생각하지 않지만 그들이 일하는 방식에 우선 순위가 있습니다. @PostConstruct, init-method는 BeanPostProcessors입니다.
자세한 정보는 Spring의 참조 문서를 확인하면된다.
-
==============================
2.진정한 차이는 없습니다. 그것은 시스템 구성을 선호하는 방법에 달려 있으며, 이는 개인 선택의 문제입니다. 저 자신, @PostConstruct 주석을 사용하는 것을 선호합니다 (메소드가 호출 된 후에 만 Bean이 올바르게 구성되므로), Spring을 인식하지 않는 라이브러리에서 Bean을 인스턴스화 할 때 init 메소드를 사용합니다 (주석을 거기에 적용 할 수 없음). , 당연히!)하지만 나는 모든 것을 한 방향으로 또는 다른 방향으로하고 싶어하는 사람들을 완전히 이해할 수 있습니다.
진정한 차이는 없습니다. 그것은 시스템 구성을 선호하는 방법에 달려 있으며, 이는 개인 선택의 문제입니다. 저 자신, @PostConstruct 주석을 사용하는 것을 선호합니다 (메소드가 호출 된 후에 만 Bean이 올바르게 구성되므로), Spring을 인식하지 않는 라이브러리에서 Bean을 인스턴스화 할 때 init 메소드를 사용합니다 (주석을 거기에 적용 할 수 없음). , 당연히!)하지만 나는 모든 것을 한 방향으로 또는 다른 방향으로하고 싶어하는 사람들을 완전히 이해할 수 있습니다.
-
==============================
3.@postconstruct는 스프링의 일부가 아닙니다. javax 패키지의 일부입니다. 둘 다 동일합니다. 우리는 xml 파일에 추가해야하는 init 메소드를 사용합니다. @postconstruct를 사용하면 xml에 추가 할 필요가 없습니다. 아래의 기사를 확인하십시오.
@postconstruct는 스프링의 일부가 아닙니다. javax 패키지의 일부입니다. 둘 다 동일합니다. 우리는 xml 파일에 추가해야하는 init 메소드를 사용합니다. @postconstruct를 사용하면 xml에 추가 할 필요가 없습니다. 아래의 기사를 확인하십시오.
http://answersz.com/spring-postconstruct-and-predestroy/
-
==============================
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.@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 %의 경우에 있으며,이 게시물은 단지 "악마가 세부 사항에 있음"이라는 개념에 찬사를 보내는 것입니다.
from https://stackoverflow.com/questions/8519187/spring-postconstruct-vs-init-method-attribute by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 3 Web MVC 시작하기 - 모든 것을 설정하기 (0) | 2019.01.07 |
---|---|
[SPRING] ModelAndView의 Model은 Spring MVC에서 무엇입니까? (0) | 2019.01.07 |
[SPRING] HttpSecurity, WebSecurity 및 AuthenticationManagerBuilder (0) | 2019.01.07 |
[SPRING] Stateless 세션 빈을 통해 Stateful 세션 빈을 사용할 때? (0) | 2019.01.07 |
[SPRING] Spring MVC 컨트롤러의 보안 컨텍스트에서 UserDetails 객체 가져 오기 (0) | 2019.01.07 |