[SPRING] Spring - ServletContextListener에 의존성 주입
SPRINGSpring - 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.도그 베인의 답변 (수락 됨)은 작동하지만 콩이 인스턴스화되는 방식 때문에 테스트가 어려워집니다. 나는이 질문에서 제안 된 접근법을 선호한다.
도그 베인의 답변 (수락 됨)은 작동하지만 콩이 인스턴스화되는 방식 때문에 테스트가 어려워집니다. 나는이 질문에서 제안 된 접근법을 선호한다.
@Autowired private Properties props; @Override public void contextInitialized(ServletContextEvent sce) { WebApplicationContextUtils .getRequiredWebApplicationContext(sce.getServletContext()) .getAutowireCapableBeanFactory() .autowireBean(this); //Do something with props ... }
-
==============================
2.리스너 빈을 제거하고 내 특성에 대한 새 빈을 작성하여이를 해결했습니다. 그런 다음 리스너에서 다음을 사용하여 등록 정보 bean을 얻습니다.
리스너 빈을 제거하고 내 특성에 대한 새 빈을 작성하여이를 해결했습니다. 그런 다음 리스너에서 다음을 사용하여 등록 정보 bean을 얻습니다.
@Override public void contextInitialized(ServletContextEvent event) { final WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(event.getServletContext()); final Properties props = (Properties)springContext.getBean("myProps"); }
-
==============================
3.앞서 언급했듯이 ServletContextListener는 서버에 의해 만들어 지므로 Spring에 의해 관리되지 않습니다.
앞서 언급했듯이 ServletContextListener는 서버에 의해 만들어 지므로 Spring에 의해 관리되지 않습니다.
ServletContext의 통지를 받고 싶으면, 다음의 인터페이스를 구현할 수 있습니다.
org.springframework.web.context.ServletContextAware
-
==============================
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.ServletContextListener는 Spring이 아닌 서버에 의해 생성됩니다.
ServletContextListener는 Spring이 아닌 서버에 의해 생성됩니다.
편집 : AFAIK, 당신은 당신이 무엇을 하려는지, 당신은 리스너에서 인스턴스 변수를 설정하고자하는 이유를 얻을 수 없다?
from https://stackoverflow.com/questions/4746041/spring-injecting-a-dependency-into-a-servletcontextlistener by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 최대 절전 모드 세션 및 트랜잭션 관리와 Spring을 통합하는 방법은 무엇입니까? (0) | 2018.12.08 |
---|---|
[SPRING] 메모리 내 단위 테스트 방법 Spring-Jersey (0) | 2018.12.08 |
[SPRING] @ResponseBody를 사용하여 Spring Controller에서 JSON 데이터를 반환하는 방법 (0) | 2018.12.08 |
[SPRING] 스프링 부트를 가져 와서 데이터베이스 스키마를 자동으로 만들 수 없습니다. (0) | 2018.12.08 |
[SPRING] 스프링 부트 애플리케이션을 프로그래밍 방식으로 종료 (0) | 2018.12.08 |