Spring异步 - 无法获取异步bean

时间:2012-01-03 23:59:31

标签: java spring proxy classcastexception spring-3

ApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);

AsyncBean session = ctx.getBean(AsyncBean.class);

Caused by: java.lang.ClassCastException: $Proxy14 cannot be cast to AsyncBean

无法弄清楚如何在@EnableAsync中使用@Async ....它似乎产生了代理,我无法获得单例的句柄。

另一个例子:

@Bean
public Bean bean(){
   Bean bean=new Bean();
   bean.registerHandler(asyncBean());
}

@Bean 
public AsyncBean asyncBean(){
   return new AsyncBean();
 }

这也会抛出相同的类强制转换异常......引起:

  

java.lang.ClassCastException:$ Proxy14无法强制转换为AsyncBean

2 个答案:

答案 0 :(得分:1)

Spring要求AsyncBean是一个接口而不是一个类。通常,代理类必须是接口。

答案 1 :(得分:0)

AsyncBean是否实现了一个接口。如果是这样,默认情况下Spring会生成基于接口的JDK代理。为了从上下文中查找bean,你必须使用bean实现的一个接口。例如

public class AsyncBean implements CertainInterface{
}

您可以访问CertainInterface c = ctx.getBean(CertainInterface.class);

如果AsyncBean没有实现任何接口,那么Spring使用基于CGLIB类的代理。如果是这样,那么你的代码就可以了。

如果你希望AsyncBean仍然实现一个接口但你想使用基于类的代理,那么你可以指示Spring这样做使用@EnableAsync(proxyTargetClass = true)