1

SOAP サービスへの接続を管理するために、Spring MVC 3.2.4 と Apache Commons Pooling 2.3 を使用しています。私が使用しているものの 1 つは、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 実装を調べると、エビクション クラスがリフレクションを使用してインスタンス化され、実行されます。生成されたクラスで @EnableLoadTimeWeaving および @Configurable を使用したロード時のウィービングなどの一般的な手法を使用するなど、Spring Bean をこのクラスに注入する試みはすべて失敗しました。

リフレクションによって内部的に生成され、Spring コンテナーによって管理されないクラスに Spring Bean を注入することは可能ですか?

編集:

以下は、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クラスをSpring Beanで「ブリッジ」するのに問題があります。私の理解が正しければ、そのチェックのインスタンス化と実行は制御できません (finalメソッドを参照してください)。したがって、私の提案は単純です(あまり良くありませんが):

  1. 必要なSpring Beanをいくつかの静的メソッド/フィールド(〜シングルトンパターン)を介して利用可能にし、Springの初期化中に設定します。
  2. この静的メソッドを介してこの Bean を取得し、必要なチェックを呼び出す通常の (非スプリング) クラスを作成します。
  3. このクラスを apache commons に登録します。
于 2015-02-01T11:31:53.127 に答える