2010-03-10 45 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");