java使用bean引用从SpringXML配置迁移到@configuration(Servlet3.0)会导致BeanNotOfRequiredTypeException
我正在使用相应的@configuration注释从基于xml的spring配置迁移到基于“类”的配置
我遇到了以下问题:我想创建一个新bean,它引用了另一个(服务)bean。因此,我自动连接这个类以在bean创建期间设置这个引用。我的配置类如下所示:
@Configuration
@ComponentScan(basePackages = {"com.akme"})
public class ApplicationContext {
@Resource
private StorageManagerBean storageManagerBean;
@Bean(name = "/storageManager")
public HessianServiceExporter storageManager() {
HessianServiceExporter hessianServiceExporter = new HessianServiceExporter();
hessianServiceExporter.setServiceInterface(StorageManager.class);
hessianServiceExporter.setService(storageManagerBean);
return hessianServiceExporter;
}
}
但这不起作用,因为在启动期间会导致BeanNotOfRequiredTypeException异常
Bean named 'storageManagerBean' must be of type [com.akme.StorageManagerBean], but was actually of type [com.sun.proxy.$Proxy20]
StorageManagerBean使用@Service注释进行注释。基于xml的配置工作正常:
<bean name="/storageManager" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="storageManagerBean"/>
<property name="serviceInterface" value="com.akme.StorageManager"/>
</bean>
所以,我不知道我做错了什么,也不知道为什么spring试图自动连接代理类
我感谢你的帮助
致以最良好的祝愿, 丹尼尔
# 1 楼答案
当使用SpringRemoting时,它将为远程bean创建代理。这是为了隐藏所用技术的复杂性。因此,在您的例子中,它将构造一个实现
StorageManager
接口的代理,因此它将创建一个实现该接口的代理现在不仅适用于Spring远程处理,而且基本上也适用于Spring AOP,AOP与代理一起应用(如参考指南中所述)。因此,我怀疑您的
StorageManagerBean
周围有事务,默认情况下,这些事务会导致JDK动态代理。这个代理也是基于接口的简而言之,注入一个
StoreManager
实例,而不是一个StoreManagerBean
实例