문제

ApplicationContext로드 업에서 Bean 만 Once에서 (비 정적) 메소드를 호출 해야하는 사용 사례가 있습니다. 이를 위해 MethodInvokingFactoryBean을 사용해도 괜찮습니까? 아니면 더 나은 솔루션이 있습니까?

참고로 ConfigContextLoaderListener를 사용하여 웹 응용 프로그램에 응용 프로그램 컨텍스트를로드합니다. Bean 'a'가 인스턴스화되면 Methoda ()를 한 번 호출하십시오.

이 작업은 어떻게 멋지게 할 수 있습니까?

도움이 되었습니까?

해결책

다음과 같은 것을 사용할 수 있습니다.

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

콩이 인스턴스화 될 때 "init"메소드를 호출합니다.

다른 팁

다른 답변에서 @PostConstruct 제안을 확장하기 위해, 이것은 실제로 최선의 해결책입니다.

  • 스프링 API에서 코드를 분리시킵니다 (@PostConstruct는 Javax에 있습니다.*)
  • 콩을 초기화하기 위해 호출 해야하는 것으로 명시 적으로 init 메소드에 주석을 달아줍니다.
  • Spring Bean 정의에 Init-Method 속성을 추가하는 것을 기억할 필요는 없습니다. Spring은 자동으로 메소드를 호출합니다 (어쨌든 컨텍스트의 다른 곳에서 주석-콘피드 옵션을 등록한다고 가정).

고려해야 할 세 가지 다른 접근법이 있습니다. 참조

초기 방법 속성을 사용하십시오

장점 :

  • Bean이 인터페이스를 구현하려면 필요하지 않습니다.

단점 :

  • Bean이 올바르게 구성되도록 구성 후이 방법이 건설 후에 필요하다는 즉각적인 표시는 없습니다.

초기화 비안을 구현하십시오

장점 :

  • 초기 방법을 지정하거나 구성 요소 스캔 / 주석 처리를 켜질 필요가 없습니다.
  • 라이브러리가 제공되는 콩에 적합합니다.이 라이브러리를 사용하는 응용 프로그램이 Bean 라이프 사이클과 관련이있는 응용 프로그램을 원하지 않습니다.

단점 :

  • 초기 방법보다 더 침습적입니다.

JSR-250을 사용하십시오 @PostConstruct 라이프 스타일 주석

장점 :

  • 구성 요소 스캔을 자동 복조 콩에 사용할 때 유용합니다.
  • 특정 방법이 초기화에 사용되어야 함을 분명히합니다. 의도는 코드에 더 가깝습니다.

단점 :

  • 초기화는 더 이상 구성에 중앙에 지정되지 않습니다.
  • 주석 처리를 켜는 것을 기억해야합니다 (때로는 잊을 수 있음).

구현을 시도 했습니까? InitializingBean? 정확히 당신이 따르는 것 같네요.

단점은 콩이 봄을 인식한다는 것입니다. 그러나 대부분의 응용 분야에서는 그렇게 나쁘지 않습니다.

사용자 정의를 배포 할 수 있습니다 BeanPostProcessor 응용 프로그램 컨텍스트에서. 또는 콩에서 스프링 인터페이스를 구현하는 것이 마음에 들지 않으면 초기화 비안 인터페이스 또는 "초 모드"지시 (동일한 링크).

두 가지 접근법에 대한 혼란을 더욱 명확하게하기 위해

  1. @PostConstruct 그리고
  2. init-method="init"

개인적인 경험을 통해 (1)을 사용하는 것은 서블릿 컨테이너에서만 작동하는 반면 (2) 데스크탑 응용 프로그램에서도 모든 환경에서 작동한다는 것을 깨달았습니다. 따라서 독립형 애플리케이션에서 Spring을 사용하는 경우 (2) "초기화 후이 방법을 호출하기 위해 (2)를 사용해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top