Spring自动装配类与接口有什么区别?

7 浏览
0 Comments

Spring自动装配类与接口有什么区别?

我有这个Spring配置:


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

@Autowired
TheInterface x;
@Autowired
TheClass y;

接口TheInterface的自动装配可以正常工作,但是类TheClass的自动装配失败了。Spring给我抛出了一个NoSuchBeanDefinitionException异常,表示找不到这个类的定义。

为什么你可以装配接口而不能装配类呢?

0
0 Comments

Spring的自动装配功能可以应用于接口和类。但是,当使用自动代理时,需要针对接口进行编程而不是实现类。

问题出现的原因可能是在上下文中有一个自动生成代理对象的自动代理生成器,它将boo bean包装在一个生成的代理对象中。这个代理对象将实现TheInterface接口,但不是一个TheClass类。如果使用了自动代理,就需要针对接口进行编程,而不是具体的实现类。

可能的候选对象是事务代理 - 是否在使用Spring事务、使用AspectJ或

那么问题就在这里了。如果使用了<tx:annotation-driven/>,就不能将bean强制转换为MyClass,而必须使用接口。

我知道这有点旧了,但在这里增加一点...您不一定需要使用接口,但是为了直接将类进行自动装配,需要修改<tx:annotation-driven />配置并添加proxy-target-class="true"(默认为false)。这允许您直接自动装配类。请注意,可能会出现奇怪的副作用,例如我曾经使用反射来找到泛型基类的参数化类型。由于代理类的继承关系发生了变化,因此我必须考虑这一点。即使使用proxy-target-class="true",仍然可以通过接口进行装配。

0