복붙노트

[SPRING] 서버 시작 및 완전히로드 된 모든 스프링 빈에 대한 리스너

SPRING

서버 시작 및 완전히로드 된 모든 스프링 빈에 대한 리스너

내 웹 응용 프로그램에서 Listener를 만들어서 서버가 시작되고 모든 Bean이로드 될 때 알림을 받으려고합니다. 그 Listener에서 서비스 메소드를 호출하려고합니다. 나는 ServletContextListener를 사용했다. 그것은 contextInitialized 메서드가 있지만 내 경우에는 작동하지 않습니다. 그것은 서버가 시작될 때 스프링 콩 생성 이전에 얽매이지 않습니다. 그래서 서비스 클래스의 인스턴스를 null로 가져옵니다. 리스너를 만드는 다른 방법이 있습니까?

해결법

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

    1.Spring 컨텍스트 설정에서 ApplicationListener의 인스턴스를 등록하기 위해 갈 것입니다. ContextRefreshedEvent는 애플리케이션 컨텍스트가 초기화되거나 새로 고쳐질 때 신호를받습니다. 이 순간 이후에 당신은 당신의 서비스를 부를 수 있습니다.

    Spring 컨텍스트 설정에서 ApplicationListener의 인스턴스를 등록하기 위해 갈 것입니다. ContextRefreshedEvent는 애플리케이션 컨텍스트가 초기화되거나 새로 고쳐질 때 신호를받습니다. 이 순간 이후에 당신은 당신의 서비스를 부를 수 있습니다.

    아래에는 ApplicationListener 구현 (서비스에 따라 다름)과이를 구현하는 데 필요한 Spring 구성 (Java 및 XML 모두)이 나와 있습니다. 앱과 관련된 구성을 선택해야합니다.

    Java 기반 구성

    @Configuration
    public class JavaConfig {
    
        @Bean
        public ApplicationListener<ContextRefreshedEvent> contextInitFinishListener() {
            return new ContextInitFinishListener(myService());
        }
    
        @Bean
        public MyService myService() {
            return new MyService();
        }
    }
    

    XML

        <bean class="com.package.ContextInitFinishListener">
            <constructor-arg>
                <bean class="com.package.MyService"/>
            </constructor-arg>
        </bean>
    

    다음은 ContextInitFinishListener 클래스의 코드입니다.

    import org.springframework.context.ApplicationListener;
    import org.springframework.context.event.ContextRefreshedEvent;
    
    public class ContextInitFinishListener implements ApplicationListener<ContextRefreshedEvent> {
    
        private MyService myService;
    
        public ContextInitFinishListener(MyService myService) {
            this.myService = myService;
        }
    
        @Override
        public void onApplicationEvent(ContextRefreshedEvent event) {
            //call myService
        }
    }
    
  2. ==============================

    2.Spring의 이벤트 핸들링을 사용할 수있다. 찾고있는 이벤트는 아마도 ContextRefreshedEvent입니다.

    Spring의 이벤트 핸들링을 사용할 수있다. 찾고있는 이벤트는 아마도 ContextRefreshedEvent입니다.

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

    3.예, app.xml을로드하는 동안 다른 Spring 컨텍스트 XML 파일을로드하려는 경우에만 web.xml에 ContextLoaderListener를 추가해야합니다.

    예, app.xml을로드하는 동안 다른 Spring 컨텍스트 XML 파일을로드하려는 경우에만 web.xml에 ContextLoaderListener를 추가해야합니다.

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring-security.xml
    </param-value>
    </context-param>
    

    이 링크를 방문하면 더 많은 도움을받을 수 있습니다.

    여기를 클릭하십시오.

  4. from https://stackoverflow.com/questions/23054452/listener-for-server-starup-and-all-spring-bean-loaded-completely by cc-by-sa and MIT license