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