SOAP サービスへの接続を管理するために、Spring MVC 3.2.4 と Apache Commons Pooling 2.3 を使用しています。私が使用しているものの 1 つは、GenericObjectPool クラスの「アイドル オブジェクトの削除」スレッド機能です。
この機能を使用して、接続オブジェクトの削除をテストするために使用するクラスの名前を指定します。
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
}