Spring MVC:使用@Autowire获取对不同spring bean实例的引用

时间:2012-07-12 18:06:17

标签: java spring java-ee spring-mvc spring-security

我在Spring应用程序上下文文件中定义了UserCredetnialsDatSourceAdapter。我还通过DelegatingFilterProxy将一个自定义过滤器添加到Spring中。

此过滤器使用@Autowire获取对DataSource Bean的引用。我还在我的DAO中@Autowire DataSource。当我调试时,我看到Filter和DAO实例中的数据源有不同的实例id。为什么默认情况下有两个单身人士?

我还启动了jvisualvm,我查看了堆,我的应用程序上下文中的所有bean都有2个实例?感谢任何见解,也许bean前/后处理有一些功能,或者我不应该在过滤器中使用@Autowire。任何帮助都是适用的。谢谢!

修改

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config-context.xml</param-value>
 </context-param>

 <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
 </servlet>

<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.html</url-pattern>
 </servlet-mapping>

 <init-param>
<param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/web-context.xml,/WEB-INF/config-context.xml</param-value>
 </init-param>

有趣我想我知道它发生了什么。有2个实例,因为有2个上下文。一个用于应用程序,一个用于每个请求(线程)我假设?有没有办法规定使用哪种上下文?也许过滤器不是答案,我需要使用AOP。需要研究如何在@Aspect中注入bean,如果可能的话。

谢谢!

-Joe

1 个答案:

答案 0 :(得分:2)

您正在导入/WEB-INF/config-context.xml作为根应用程序上下文的一部分(一个由ContextLoaderListener加载)以及您的Web上下文(由DispatcherServlet加载)。您可以将其从DispatcherServlet中删除。