Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将Springbean注入到ApacheCommons池类流中反射生成的类中_Java_Spring_Spring Mvc_Apache Commons Pool - Fatal编程技术网

Java 如何将Springbean注入到ApacheCommons池类流中反射生成的类中

Java 如何将Springbean注入到ApacheCommons池类流中反射生成的类中,java,spring,spring-mvc,apache-commons-pool,Java,Spring,Spring Mvc,Apache Commons Pool,我正在使用SpringMVC3.2.4和ApacheCommonsPooling2.3来管理到SOAP服务的连接。我正在使用的一个功能是GenericObjectPool类中的“空闲对象逐出”线程功能: 使用此功能,我指定用于测试退出连接对象的类的名称: 检查GenericObjectPool类的Commons池实现后,使用反射实例化并执行逐出类。所有将SpringBean注入此类的尝试都失败了,包括在生成的类上使用诸如使用@EnableLoadTimeWeaving和@Configurab

我正在使用SpringMVC3.2.4和ApacheCommonsPooling2.3来管理到SOAP服务的连接。我正在使用的一个功能是GenericObjectPool类中的“空闲对象逐出”线程功能:

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

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

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

编辑:

下面是实例化驱逐器类的方法:

 ...

 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) {

    ...
下面是ReceivingPolicy类的实现示例:

  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
}
class SampleReceivingPolicy实现了ReceivingPolicy{
//我想补充一点:
//@自动连线
//私人愿望豆愿望豆
公共SampleReceivingPolicy(){}
@凌驾
布尔逐出(逐出配置逐出配置,池对象TPooleObject,int i){
//做点什么
}

如果我理解正确,您在用Springbean“桥接”非spring类时会遇到问题。如果我理解正确,检查的实例化和执行将不受您的控制(请参见那里的
final
方法)。因此我的建议很简单(尽管不是很好):

  • 通过一些静态方法/字段(~singleton模式)使您需要的Springbean可用,并在spring初始化期间进行设置
  • 生成普通(非spring)类,该类将通过此静态方法获取此bean并调用所需的检查
  • 向apache commons注册此类

  • 你能分享一些代码吗?这实际上是我在考虑选项时的第一个想法,但我需要访问整个应用程序中共享的、由Spring管理的类。我要么创建重复的类,要么将所有内容转换为非Spring管理的bean,这都不是一个很好的选项。因此,我现在所做的就是引用将spring管理的bean转换为execution类,效果很好。我建议对Apache Commons进行更改,以允许将execution类作为引用传递,从而允许对其进行spring管理。我不确定为什么现在不是这样,但我会尝试找出原因。
      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
    }