1

我正在使用 Spring MVC 3.2.4 和 Apache Commons Pooling 2.3 来管理与 SOAP 服务的连接。我正在使用的其中一件事是 GenericObjectPool 类中的“空闲对象驱逐”线程功能:

http://commons.apache.org/proper/commons-pool/api-2.3/org/apache/commons/pool2/impl/GenericObjectPool.html

使用此功能,我指定用于测试连接对象的驱逐的类的名称:

http://commons.apache.org/proper/commons-pool/api-2.3/org/apache/commons/pool2/impl/BaseObjectPoolConfig.html#setEvictionPolicyClassName(java.lang.String)

在检查 GenericObjectPool 类的 Commons Pooling 实现后,驱逐类使用反射进行实例化并执行。所有将 Spring bean 注入此类的尝试都失败了,包括使用常见技术,例如在生成的类上使用 @EnableLoadTimeWeaving 和 @Configurable 进行加载时编织。

是否可以将 Spring bean 注入到由反射在内部生成且不受 Spring 容器管理的类中?

编辑:

下面是实例化 evictor 类的方法:

 ...

 public final void setEvictionPolicyClassName(
        String evictionPolicyClassName) {
    try {
        Class<?> clazz = Class.forName(evictionPolicyClassName);
        Object policy = clazz.newInstance();
        if (policy instanceof EvictionPolicy<?>) {
            @SuppressWarnings("unchecked") // safe, because we just checked the class
            EvictionPolicy<T> evicPolicy = (EvictionPolicy<T>) policy;
            this.evictionPolicy = evicPolicy;
        }
    } catch (ClassNotFoundException e) {

    ...

这是在设定的时间间隔内在线程内执行的 run 方法:

  ...

  @Override
    public void run() {
        ClassLoader savedClassLoader =
                Thread.currentThread().getContextClassLoader();
        try {
            // Set the class loader for the factory
            Thread.currentThread().setContextClassLoader(
                    factoryClassLoader);

            // Evict from the pool
            try {
                evict();
            } catch(Exception e) {

     ...

下面是 EvictionPolicy 类的实现示例:

  class SampleEvictionPolicy implements EvictionPolicy<SabreConnection> {

// This is what I would like to add:
// @Autowired
// private desiredBeans desiredBeans

public SampleEvictionPolicy() { }

@Override
boolean evict(EvictionConfig evictionConfig, PooledObject<SabreConnection> tPooledObject, int i) {
   // Do some stuff
}
4

1 回答 1

1

如果我对您的理解正确,那么您在使用 Spring bean“桥接”非弹簧类时会遇到问题。如果我理解正确,那么检查的实例化和执行是您无法控制的(请参见final那里的方法)。所以我的建议很简单(虽然不是很好):

  1. 通过一些静态方法/字段(〜单例模式)使您需要的spring bean可用,并在spring初始化期间设置它。
  2. 制作将通过此静态方法获取此 bean 并调用所需检查的普通(非弹簧)类。
  3. 用 apache commons 注册这个类。
于 2015-02-01T11:31:53.127 回答