ApplicationContext 가로 드 될 때 Bean에서 (정적이 아닌) 메소드를 한 번만 호출 해야하는 유스 케이스가 있습니다. MethodInvokingFactoryBean을 사용하면 괜찮습니까? 아니면 더 나은 해결책이 있습니까?
참고로 ConfigContextLoaderListener를 사용하여 웹 응용 프로그램에 응용 프로그램 컨텍스트를로드합니다. 빈 ‘A’가 인스턴스화되면 methodA ()를 한 번만 호출하십시오.
어떻게하면 잘할 수 있습니까?
답변
다음과 같은 것을 사용할 수 있습니다.
<beans>
<bean id="myBean" class="..." init-method="init"/>
</beans>
Bean이 인스턴스화 될 때 “init”메소드를 호출합니다.
답변
다른 답변에서 @PostConstruct 제안을 확장하려면 이것이 실제로 가장 좋은 해결책이라고 생각합니다.
- 코드를 Spring API에서 분리합니다 (@PostConstruct는 javax. *).
- Bean을 초기화하기 위해 호출 해야하는 것으로 init 메소드에 명시 적으로 주석을 달았습니다.
- 스프링 빈 정의에 init-method 속성을 추가 할 필요가 없습니다. 스프링은 자동으로 메소드를 호출합니다 (어쨌든 어노테이션에서 어노테이션 구성 옵션을 등록한다고 가정).
답변
참고 문헌에 설명 된 것처럼 고려해야 할 세 가지 접근법이 있습니다.
init-method 속성 사용
장점 :
- 인터페이스를 구현하기 위해 Bean이 필요하지 않습니다.
단점 :
- Bean이 올바르게 구성되었는지 확인하기 위해 구성 후에이 방법이 필요하지 않습니다.
InitializingBean 구현
장점 :
- init-method를 지정하거나 구성 요소 스캐닝 / 주석 처리를 켤 필요가 없습니다.
- 라이브러리와 함께 제공되는 Bean에 적합합니다.이 라이브러리를 사용하는 응용 프로그램이 Bean 라이프 사이클과 관련되지 않도록합니다.
단점 :
- init-method 방식보다 더 침습적입니다.
JSR-250 @PostConstruct lifecyle 주석 사용
장점 :
- 컴포넌트 스캔을 사용하여 Bean을 자동 감지 할 때 유용합니다.
- 초기화에 특정 방법을 사용해야한다는 것을 분명히합니다. 의도는 코드에 더 가깝습니다.
단점 :
- 구성에서 초기화가 더 이상 중앙에서 지정되지 않습니다.
- 주석 처리를 설정해야합니다 (이따금 잊을 수 있음)
답변
구현을 시도 했습니까 InitializingBean
? 당신이 쫓는 것과 똑같습니다.
단점은 bean이 Spring을 인식하지만 대부분의 응용 프로그램에서는 그렇게 나쁘지 않다는 것입니다.
답변
애플리케이션 컨텍스트에 사용자 정의 BeanPostProcessor 를 배치하여 이를 수행 할 수 있습니다. 또는 Bean에서 Spring 인터페이스를 구현하는 것이 마음에 들지 않으면 InitializingBean 인터페이스 또는 “init-method”지시문 (동일한 링크)을 사용할 수 있습니다.
답변
두 가지 접근 방식에 대한 혼란, 즉
@PostConstruct
과init-method="init"
개인적인 경험을 통해 (1) 서블릿 컨테이너에서만 작동하고 (2) 데스크탑 환경에서도 모든 환경에서 작동한다는 것을 깨달았습니다. 따라서 독립형 애플리케이션에서 Spring을 사용하려면 (2)를 사용하여 “초기화 후이 메소드를 호출해야합니다.