2014-01-23 1 views
0

app에서 우리는 즉시 구성을 업데이트 할 수있는 기능을 제공합니다. 우리는 또한 필터로 스프링 빈을 등록 DelegatingFilterProxy을 사용하는Spring 애플리케이션 컨텍스트 재 로딩이 DelegatingFilterProxy에 의해 등록 된 Bean을 업데이트하지 않음

((ConfigurableApplicationContext)applicationContext).refresh(); 

:이 응용 프로그램 속성 및 호출을 무시합니다.

@Override 
protected Filter[] getServletFilters() { 
    DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy("myFilter"); 
    delegatingFilterProxy.setContextAttribute(FrameworkServlet.SERVLET_CONTEXT_PREFIX + "dispatcher"); 

    return new Filter[] { delegatingFilterProxy }; 
} 

는 내가 봄 모든 콩을 reccreate하지만 DelegatingFilterProxy 여전히 (그래서 모든 요청이 그것에 오래된 autowire가 콩 오래된 필터에 의해 필터링) 필터 콩

할 일의 첫 번째 버전을 사용하는 것을 볼 수 application.properties를 다시로드 할 때 이걸 없애는 법이 왜 일어나는 지 알아?

답변

1

왜 그런지 알 수 있습니다.

DelegatingFilterProxyWebApplicationInitializer 하위 클래스 (예 : AbstractDispatcherServletInitializer 하위 클래스)에 등록한다고 가정합니다.

에 관계없이이 클래스는 ApplicationContext에 대한 작업과는 완전히 독립적입니다. 서블릿 컨테이너는 클래스 패스를 검사하고 구현을 찾고이를 실행하는 Spring의 SpringServletContainerInitializer을 찾습니다. 그런 다음 빈 이름을 지정하여 DelegatingFilterProxy을 등록합니다.

첫 번째 요청이 서버에 도착하면 DelegatingFilterProxyApplicationContext에서 대리인을 찾고 해당 대리인 필드로 설정하려고 시도합니다. 현재 대리인이 null 인 경우에만이 작업을 수행합니다. 따라서 문맥을 새로 고침해도 영향을받지 않습니다.

가능한 해결책은 입니다.

관련 문제