我正在使用 Spring MVC 3.2.4 和 Apache Commons Pooling 2.3 来管理与 SOAP 服务的连接。我正在使用的其中一件事是 GenericObjectPool 类中的“空闲对象驱逐”线程功能:
使用此功能,我指定用于测试连接对象的驱逐的类的名称:
在检查 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
}