从servlet过滤器和标记访问Spring bean

时间:2010-03-10 12:07:15

标签: spring servlets tags javabeans servlet-filters

我可以使用

访问我的Servlet中的Spring bean
WebApplicationContext springContext = 
    WebApplicationContextUtils.getWebApplicationContext(getServletContext()); 

在Servlet的init方法中。

我想知道servlet过滤器有WebApplicationContext的等价物吗? 另外,是否可以在标记类中访问Spring bean?

4 个答案:

答案 0 :(得分:38)

对于过滤器 - 使用Filter.init()

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

对于代码 - 请使用TagSupport.pageContext(请注意SimpleTagSupport中不可用):

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

答案 1 :(得分:26)

您可以使用Spring文档中提到的DelegatingFilterProxy:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/security-filter-chain.html#delegating-filter-proxy

您只需使用与web.xml中声明的filter-name相同的bean名称声明您的真实Filter bean:

的web.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" />  

答案 2 :(得分:2)

有几种方法可以获得它

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

  2. WebApplicationContext springContext = RequestContextUtils.getWebApplicationContext(servletRequest)

  3. 然后

    springContext.getBean("myBeanId");
    

答案 3 :(得分:0)

您可以使用ContextEsposingHttpServletRequest包装器将所有bean作为请求属性。