복붙노트

[SPRING] 스프링 애플리케이션 컨텍스트 이벤트를 다른 컨텍스트로 연결하는 방법

SPRING

스프링 애플리케이션 컨텍스트 이벤트를 다른 컨텍스트로 연결하는 방법

ContextLoaderListener에 의해 구축 된 하나 (applicationContext)와 DispatcherServlet에 의해 구축 된 두 번째 (webContext)의 두 가지 컨텍스트를 가진 Spring 웹 애플리케이션이있다.

applicationContext 내에는 스프링 컨텍스트 이벤트를 발생시키는 bean (org.springframework.security.authentication.DefaultAuthenticationEventPublisher)이있다.

그러나 이벤트 수신자는 webContext에 정의되어 있습니다. 그리고 수신기는 이벤트를 얻지 못했습니다. (테스트 목적으로 수신기를 applicationContext에두면 이벤트가 발생하지만 기능을 수행하려면 webContexts가 필요하므로이 작업을 수행 할 수 없습니다.)

그래서 내 질문은, 어떻게 응용 프로그램 컨텍스트에서 webContext 이벤트를 연결하는 것입니다?

해결법

  1. ==============================

    1.동일한 문제가 발생하여 이벤트를 만드는 빈을 웹 컨텍스트로 이동하여 내 문제를 해결했습니다. 그러나 이벤트 리스너를 수동으로 연결하여 문제를 해결할 수 있습니다 (이 코드는 컴파일되지 않으므로 테스트되지 않습니다).

    동일한 문제가 발생하여 이벤트를 만드는 빈을 웹 컨텍스트로 이동하여 내 문제를 해결했습니다. 그러나 이벤트 리스너를 수동으로 연결하여 문제를 해결할 수 있습니다 (이 코드는 컴파일되지 않으므로 테스트되지 않습니다).

    @Component    
    public class BeanInWebContext implements ApplicationListener<SomeEvent> {
    
        @Autowired
        private ApplicationContext webContext;
    
        @PostConstruct
        public void registerAsListener() {
            // get parent context
            AbstractApplicationContext appContext = (AbstractApplicationContext) webContext.getParent();
            // register self as a listener, this method is in AbstractApplicationContext
            appContext.addApplicationListener(this);
        }
    
        @Override
        public void onApplicationEvent(SomeEvent event) {
        }
    
    }
    
  2. ==============================

    2.실제 답변은 앱을 다르게 구성하려는 것일 수 있다고 생각합니다 (즉, 하나의 컨텍스트 만 가질 수 있도록) 내 web.xml에서 다음과 같이해야한다고 생각한다.

    실제 답변은 앱을 다르게 구성하려는 것일 수 있다고 생각합니다 (즉, 하나의 컨텍스트 만 가질 수 있도록) 내 web.xml에서 다음과 같이해야한다고 생각한다.

    <servlet>
        <servlet-name>example</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>               
                classpath:/META-INF/applicationSpringConfig.xml
            </param-value>
        </init-param> 
    </servlet>
    

    그러나 더 깊은 질문에 답하십시오. 스프링 파일에서 include를 사용할 수 있다고 지적한 사람도 있습니다 (실제로 위의 경우 디스패처 서블릿에 둘 이상의 springconfig를 지정할 수 있음). 하지만 다른 컨텍스트 파일을 포함 시키면 bean 인스턴스를 공유하지 않고 정의 만 공유합니다.

    모듈화 (Modularizing) Spring 어플리케이션은 EJB와 비교할 때 Spring의 유일한 단점이었습니다. 그로 인해 Spring은 OSGi를 사용하게되었습니다. 그리고 스프링 컨텍스트를 공유하는 방법에 대한 기본적인 질문에 대한 대답은 공식적으로 OSGi (spring dm)를 사용하여 컨텍스트간에 스프링 빈 인스턴스를 공유하는 것입니다.

  3. ==============================

    3.이벤트 게시자를 웹 컨텍스트 파일로 이동하여 전체 애플리케이션 컨텍스트에 대한 가시성을 확보해야합니다. 부모 응용 프로그램 컨텍스트에서 메서드 보안을 구성 할 때도 비슷한 문제가 발생합니다. 부모 응용 프로그램 컨텍스트 (ContextLoaderListener에 의해로드 됨)는 자식 (웹) 컨텍스트를 인식하지 못합니다.

    이벤트 게시자를 웹 컨텍스트 파일로 이동하여 전체 애플리케이션 컨텍스트에 대한 가시성을 확보해야합니다. 부모 응용 프로그램 컨텍스트에서 메서드 보안을 구성 할 때도 비슷한 문제가 발생합니다. 부모 응용 프로그램 컨텍스트 (ContextLoaderListener에 의해로드 됨)는 자식 (웹) 컨텍스트를 인식하지 못합니다.

    둘 사이에 부모 - 자식 관계가 실제로 필요하지 않은 경우 전체 응용 프로그램에 대해 단일 응용 프로그램 컨텍스트를 사용할 수도 있습니다. 종종 그것은 단지 방해가되지 않으며 모든 빈이 동일한 공간에 정의 된 경우 더 쉽습니다.

  4. ==============================

    4.스프링 프레임 워크의 문서에서 언급 한 것처럼 단순한 ApplicationEvent 메커니즘은 동일한 애플리케이션 컨텍스트 내에서만 사용되도록 설계되었으며, 자식 컨텍스트에 이벤트를 전파 할 수 있다는 사실을 알지 못합니다.

    스프링 프레임 워크의 문서에서 언급 한 것처럼 단순한 ApplicationEvent 메커니즘은 동일한 애플리케이션 컨텍스트 내에서만 사용되도록 설계되었으며, 자식 컨텍스트에 이벤트를 전파 할 수 있다는 사실을 알지 못합니다.

    고급 솔루션이 필요한 경우 Java Message Service 또는 Spring Integration과 같은보다 향상된 솔루션을 사용할 수 있습니다.

    http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#context-functionality-events

  5. ==============================

    5.import 태그를 사용하여 이벤트 / bean의 가시성이 사용 가능하고 공유되는 방식으로 작성된 두 가지 컨텍스트를 가져 오거나 연결합니다.

    import 태그를 사용하여 이벤트 / bean의 가시성이 사용 가능하고 공유되는 방식으로 작성된 두 가지 컨텍스트를 가져 오거나 연결합니다.

    <import resource="applicationContext_name.xml"/>
    

    이 가져 오기에서는 DispatcherServlet 컨텍스트 xml의 ContextLoaderListener에서 생성되도록 구성된 컨텍스트 xml을 가져옵니다.

  6. from https://stackoverflow.com/questions/8534222/how-to-bridge-spring-application-context-events-to-an-other-context by cc-by-sa and MIT license