2010-03-10 62 views
23

我可以訪問我的Servlet的Spring bean。訪問的Spring beans和標籤

我想知道是否有相當於用於servlet過濾器的WebApplicationContext? 另外,是否可以訪問標籤類中的Spring bean?

回答

37

對於過濾器 - 使用Filter.init()

public void init(FilterConfig config) { 
    WebApplicationContext springContext = 
     WebApplicationContextUtils.getWebApplicationContext(config.getServletContext()); 
} 

對於標籤 - 使用TagSupport.pageContext(請注意,這不是提供SimpleTagSupport):

WebApplicationContext springContext = 
    WebApplicationContextUtils.getWebApplicationContext(pageContext.getServletContext()); 
+1

我覺得我要做一個愚蠢的或明顯問題(我想現在花時間尋找它),但我會盡力:wi上下文應該始終(在每次運行中)準備好在過濾器的init方法中?無論答案如何,一個可證明的論證是值得讚賞的。謝謝 – reallynice 2014-09-23 09:37:49

+4

@niconic:根據Servlet API規範3.0,第10.12節「Web應用程序部署」,應用程序上下文由ContextLoaderListener初始化,所有servlet上下文偵聽器都在「Filter」初始化之前被調用。 – axtavt 2014-09-23 15:01:37

+0

axtavt,完美,正是我所期待的,非常感謝 – reallynice 2014-09-24 17:03:05

26

你可以使用一個DelegatingFilterProxy爲Spring文檔中提到:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/security-filter-chain.html#delegating-filter-proxy

我們必須用同一個bean的名稱在web.xml中聲明的過濾器的名稱聲明你真正的篩選豆:

網.XML:

<filter> 
     <filter-name>SpringTestFilter</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>SpringTestFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

的applicationContext.xml:

<bean id="SpringTestFilter" class="com.company.app.servlet.SpringTestFilter" /> 
+0

有沒有例子說明如何使用沒有web.xml src文件的Java配置來實現這個功能? – Snekse 2014-08-19 21:10:19

2

有幾種方法可以得到它

  1. WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(getFilterCongig().getServletContext());

  2. WebApplicationContext springContext = RequestContextUtils.getWebApplicationContext(servletRequest)

然後

springContext.getBean("myBeanId");