java - Spring MVC : Using @Autowire is getting references to different spring bean instances

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

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

此过滤器使用 @Autowire 来获取对 DataSource Bean 的引用。我还在我的 DAO 中@Autowire 数据源。当我调试时,我看到 Filter 和 DAO 实例中数据源的实例 ID 不同。为什么有 2 个实例,而默认情况下这些实例都是单例?

我还启动了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 中注入(inject) bean,如果可能的话。

谢谢!!

-乔

最佳答案

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

关于java - Spring MVC : Using @Autowire is getting references to different spring bean instances,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11457914/

相关文章:

java - 如何引用 src/main/resources 文件夹中的 .wsdl 文件?

java - 使用嵌入式容器测试 EJB。我怎样才能登录?

java - 使用 Spring 3 的动态作业调度

java - 为什么解释性语言被认为更具可移植性?

java - 按升序/降序对 Firebase 数据进行排序

java - Android API 级别 23 中的 ISO 8601 问题

java - 这个(不安全的)代码会使 JVM 崩溃吗?

java - Spring路径绑定(bind): is it bound directly to the variable or does it invoke the constructor/setters?

Tomcat - 不作为服务运行时设置工作目录

java - Spring MVC 不明确的映射。无法映射