복붙노트

[SPRING] Spring - ServletContextListener에 의존성 주입

SPRING

Spring - ServletContextListener에 의존성 주입

ServletContextListener에 종속성을 주입하고 싶습니다. 그러나, 내 접근 방식이 작동하지 않습니다. Spring이 setter 메서드를 호출하는 것을 볼 수 있지만 나중에 contextInitialized가 호출 될 때 속성은 null입니다.

여기에 내 설정입니다 :

ServletContextListener :

public class MyListener implements ServletContextListener{

    private String prop;

    /* (non-Javadoc)
     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
     */
    @Override
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("Initialising listener...");
        System.out.println(prop);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
    }

    public void setProp(String val) {
        System.out.println("set prop to " + prop);
        prop = val;
    }
}

web.xml : (파일의 마지막 리스너)

<listener>
  <listener-class>MyListener</listener-class>
</listener> 

applicationContext.xml :

<bean id="listener" class="MyListener">
  <property name="prop" value="HELLO" />
</bean>  

산출:

set prop to HELLO
Initialising listener...
null

이것을 달성하기위한 올바른 방법은 무엇입니까?

해결법

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

    1.도그 베인의 답변 (수락 됨)은 작동하지만 콩이 인스턴스화되는 방식 때문에 테스트가 어려워집니다. 나는이 질문에서 제안 된 접근법을 선호한다.

    도그 베인의 답변 (수락 됨)은 작동하지만 콩이 인스턴스화되는 방식 때문에 테스트가 어려워집니다. 나는이 질문에서 제안 된 접근법을 선호한다.

    @Autowired private Properties props;
    
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        WebApplicationContextUtils
            .getRequiredWebApplicationContext(sce.getServletContext())
            .getAutowireCapableBeanFactory()
            .autowireBean(this);
    
        //Do something with props
        ...
    }    
    
  2. ==============================

    2.리스너 빈을 제거하고 내 특성에 대한 새 빈을 작성하여이를 해결했습니다. 그런 다음 리스너에서 다음을 사용하여 등록 정보 bean을 얻습니다.

    리스너 빈을 제거하고 내 특성에 대한 새 빈을 작성하여이를 해결했습니다. 그런 다음 리스너에서 다음을 사용하여 등록 정보 bean을 얻습니다.

    @Override
    public void contextInitialized(ServletContextEvent event) {
    
        final WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext());
        final Properties props = (Properties)springContext.getBean("myProps");
    }
    
  3. ==============================

    3.앞서 언급했듯이 ServletContextListener는 서버에 의해 만들어 지므로 Spring에 의해 관리되지 않습니다.

    앞서 언급했듯이 ServletContextListener는 서버에 의해 만들어 지므로 Spring에 의해 관리되지 않습니다.

    ServletContext의 통지를 받고 싶으면, 다음의 인터페이스를 구현할 수 있습니다.

    org.springframework.web.context.ServletContextAware
    
  4. ==============================

    4.이미 서버에서 생성 한 것처럼 스프링을 사용할 수 없습니다. 매개 변수를 리스너에 전달해야하는 경우 웹 xml에서 매개 변수를 컨텍스트 매개 변수로 정의 할 수 있습니다

    이미 서버에서 생성 한 것처럼 스프링을 사용할 수 없습니다. 매개 변수를 리스너에 전달해야하는 경우 웹 xml에서 매개 변수를 컨텍스트 매개 변수로 정의 할 수 있습니다

    <context-param> 
            <param-name>parameterName</param-name>
            <param-value>parameterValue</param-value>
        </context-param>
    

    Listener에서 아래와 같이 검색 할 수 있습니다.

     event.getServletContext().getInitParameter("parameterName")
    

    편집 1 :

    가능한 다른 해결책은 아래 링크를 참조하십시오.

    Spring을 사용하여 HttpSessionListener에 의존성을 주입하는 방법은 무엇입니까?

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

    5.ServletContextListener는 Spring이 아닌 서버에 의해 생성됩니다.

    ServletContextListener는 Spring이 아닌 서버에 의해 생성됩니다.

    편집 : AFAIK, 당신은 당신이 무엇을 하려는지, 당신은 리스너에서 인스턴스 변수를 설정하고자하는 이유를 얻을 수 없다?

  6. from https://stackoverflow.com/questions/4746041/spring-injecting-a-dependency-into-a-servletcontextlistener by cc-by-sa and MIT license