【问题标题】:Spring Autowiring class vs. interface?Spring自动装配类与接口?
【发布时间】:2011-01-24 03:38:26
【问题描述】:

我有这个 Spring 配置:

<bean id="boo" class="com.x.TheClass"/>

TheClass 类实现了TheInterface。然后我有这个(假设的)Java代码:

@Autowired
TheInterface x;

@Autowired
TheClass y;

TheInterface 的自动装配有效,但 TheClass 的自动装配失败。 Spring 为我的班级提供了NoSuchBeanDefinitionException

为什么你可以连接接口而不是类?

【问题讨论】:

  • 这个类有什么特别之处吗,比如它是“最终的”,或者上面有其他工具,比如@Transactional。您可能缺少检测库,例如 CGLIB,或者尝试在最终类上创建子类代理。

标签: java spring dependency-injection autowired


【解决方案1】:

通常,两者都可以,您可以自动装配接口或类。

在您的上下文中可能有一个自动代理生成器,它将您的boo bean 包装在生成的代理对象中。此代理对象将实现TheInterface,但不会是TheClass。使用自动代理时,您需要对接口进行编程,而不是对实现进行编程。

可能的候选者是事务代理——您使用的是 Spring 事务、使用 AspectJ 还是 @Transactional

【讨论】:

  • @Marcus:那就是问题所在。如果使用@Transactional&lt;tx:annotation-driven/&gt;,则无法将bean强制转换为MyClass,必须使用接口。
  • 我知道这有点老了,但在这里添加一点......你没有使用接口,而是为了直接自动装配类,需要修改&lt;tx:annotation-driven /&gt;配置,添加proxy-target-class="true"(这个默认为false)。这使您可以直接自动连接到类。请注意,可能会有奇怪的副作用,例如我使用了一些反射来找到泛型基类的参数化类型。由于代理类,继承发生了变化,所以我必须考虑到这一点。您仍然可以通过接口与proxy-target-class="true" 连接。
  • @SpankyQuigman 谢谢。这很有用。 @Scope(proxyMode=ScopedProxyMode.TARGET_CLASS)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-24
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多