7

我正在尝试使用Spring Framework IoC容器创建一个类 ThreadPoolExecutor.CallerRunsPolicy的实例。在Java中,我会做这种方式...如何从静态内部类构造函数创建Spring bean?

import java.util.concurrent.RejectedExecutionHandler; 
import java.util.concurrent.ThreadPoolExecutor; 
... 
RejectedExecutionHandler rejectedExecutionHandler = new ThreadPoolExecutor.CallerRunsPolicy(); 

但是,当我尝试做春季等价,它抛出一个CannotLoadBeanClassException

<beans> 
    <bean class="java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy"/> 
</beans> 

更普遍的:在Spring的ApplicationContext XML,你怎么能叫一个静态内部类的构造函数?

回答

13

,我认为它是不工作的原因是因为春天是不能把它理解为静态内部类。 也许这可以工作:

<beans> 
    <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/> 
</beans> 
+1

重新阅读原始问题和代码示例我意识到,drew并不试图调用静态方法;只是嵌套类的构造函数。 '$'语法在这里使用是正确的,我以前使用过这个。 – 2010-09-29 04:25:11

+0

这确实奏效,谢谢Ankit。 Spring文档在这里:http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-class,它说“为一个静态内部类配置一个bean定义,你必须使用内部类的二进制名称。“ – Drew 2010-09-30 02:16:07

1

使用the factory-method attribute

以下bean定义指定bean将通过工厂方法来创建。该定义没有指定返回对象的类型(类),而只指定了包含工厂方法的类。在这个例子中,createInstance()方法必须是一个静态方法。

<bean id="clientService" class="examples.ClientService" 
    factory-method="createInstance"/> 
+0

我没有尝试“工厂法”的一些变化,但因为ThreadPoolExecutor.CallerRunsPolicy是一个普通的旧式Java的构造并不在这里工作。这是一个静态类。 – Drew 2010-09-29 02:57:47

+0

CRP是一个静态嵌套类的事实在这里应该不重要。虽然马特b的静态方法的例子是正确的,你实际上不需要在这里调用一个静态方法......只是一个普通的ol构造函数。这就是说,我很想看到CannotLoadBeanClassException的其他细节。 – RonU 2010-09-29 03:04:58

相关问题