[spring] Bean 초기화가 완료된 후 메소드를 호출하는 방법은 무엇입니까?

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”지시문 (동일한 링크)을 사용할 수 있습니다.


답변

두 가지 접근 방식에 대한 혼란, 즉

  1. @PostConstruct
  2. init-method="init"

개인적인 경험을 통해 (1) 서블릿 컨테이너에서만 작동하고 (2) 데스크탑 환경에서도 모든 환경에서 작동한다는 것을 깨달았습니다. 따라서 독립형 애플리케이션에서 Spring을 사용하려면 (2)를 사용하여 “초기화 후이 메소드를 호출해야합니다.


답변