【问题标题】:How to create a Spring bean from a static inner class constructor?如何从静态内部类构造函数创建 Spring bean?
【发布时间】:2011-04-18 14:45:01
【问题描述】:

我正在尝试使用 Spring Framework IoC 容器来创建类的实例 ThreadPoolExecutor.CallerRunsPolicy。在 Java 中,我会这样做......

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

但是当我尝试在 Spring 中执行等效操作时,它会抛出 CannotLoadBeanClassException

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

更一般地说:在 Spring ApplicationContext XML 中,如何调用静态内部类的构造函数?

【问题讨论】:

    标签: java spring dependency-injection inversion-of-control ioc-container


    【解决方案1】:

    使用the factory-method attribute:

    以下 bean 定义指定将通过调用工厂方法创建 bean。定义没有指定返回对象的类型(类),只指定了包含工厂方法的类。在此示例中,createInstance() 方法必须是静态方法。

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

    【讨论】:

    • 我确实尝试了一些“工厂方法”的变体,但这在这里不起作用,因为 ThreadPoolExecutor.CallerRunsPolicy 是一个常规的旧 Java 构造函数。这是一个静态类。
    • CRP 是一个静态嵌套类的事实在这里并不重要。虽然 matt b 的静态方法示例是正确的,但您实际上并不需要在这里调用静态方法……只是一个普通的构造函数。话虽如此,我很想看看CannotLoadBeanClassException的其余细节。
    【解决方案2】:

    我认为它不起作用的原因是 Spring 无法将其理解为静态内部类。 可能这可以工作:

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

    【讨论】:

    • 重新阅读原始问题和代码示例我意识到 draw 根本没有尝试调用静态方法;只是嵌套类的构造函数。 $ 语法在这里使用是正确的,我自己以前用过。
    • 确实有效,感谢 Ankit。 Spring 文档在这里:static.springsource.org/spring/docs/2.0.x/reference/…,它说“要为静态内部类配置 bean 定义,您必须使用内部类的二进制名称。”
    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多