Spring Autowiring class vs. interface?

Mar*_*eon 42 java spring dependency-injection autowired

我有这个Spring配置:

<bean id="boo" class="com.x.TheClass"/>
Run Code Online (Sandbox Code Playgroud)

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

@Autowired
TheInterface x;

@Autowired
TheClass y;
Run Code Online (Sandbox Code Playgroud)

自动装配TheInterface工程但自动装配TheClass失败.春天给了我一NoSuchBeanDefinitionException堂课.

为什么你可以连接界面而不是课程?

ska*_*man 56

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

在您的上下文中可能存在一个autoproxy生成器,它将boobean 包装在生成的代理对象中.这个代理对象将实现TheInterface,但不会是TheClass.使用autoproxies时,需要编程到接口,而不是实现.

可能的候选者是事务代理 - 您使用的是使用AspectJ的Spring事务@Transactional吗?

  • 我知道这有点旧了,但是在这里添加一点......你没有_have_使用接口,但为了直接自动装配类,你需要修改`<tx:annotation-driven /> `配置并添加`proxy-target-class ="true"`(默认为false).这使您可以直接自动连接到班级.请注意,可能存在奇怪的副作用,例如,我使用了一些反射来查找通用基类的参数化类型.由于代理类,继承发生了变化,所以我不得不考虑到这一点.您仍然可以通过接口连接`proxy-target-class ="true"`. (29认同)
  • @SpankyQuigman谢谢你.这很有用.@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS) (10认同)
  • @Marcus:那就是问题所在.如果使用`@Transactional`和`<tx:annotation-driven />`,则无法将bean转换为`MyClass`,您必须使用该接口. (5认同)