我正在使用相应的@Configuration批注从基于xml的spring配置迁移到基于“class”的配置。
我遇到了以下问题:我想创建一个新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]
使用@Service批注对StorageManagerBean进行批注。基于xml的配置按预期工作:
<bean name="/storageManager" class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="storageManagerBean"/>
<property name="serviceInterface" value="com.akme.StorageManager"/>
</bean>
所以,我不知道我做错了什么以及为什么spring试图自动连接代理类。
感谢您的帮助。
祝你好运, 丹尼尔
答案 0 :(得分:3)
使用Spring Remoting时,它将为远程bean创建代理。这是为了隐藏使用过的技术的复杂性。因此,在您的情况下,它将构造一个实现StorageManager
接口的代理,因此它将创建一个实现该接口的代理。
现在不仅适用于Spring Remoting,而且基本上也适用于Spring AOP,AOP适用于代理(如参考指南中所述)。因此,我怀疑您的StorageManagerBean
周围有交易,默认情况下会导致JDK动态代理。此代理也是基于接口的。
简而言之,请注入StoreManager
个实例,而不是StoreManagerBean
个实例。