Я использую Spring MVC 3.2.4 и Apache Commons Pooling 2.3 для управления подключениями к службе SOAP. Одна из вещей, которые я использую, — это функция потока «выселение бездействующих объектов» в классе GenericObjectPool:
С помощью этой функции я указываю имя класса, который будет использоваться для проверки удаления наших объектов соединения:
После проверки реализации Commons Pooling класса GenericObjectPool класс вытеснения создается с использованием отражения и выполняется. Все попытки внедрить компоненты Spring в этот класс не увенчались успехом, в том числе с использованием распространенных методов, таких как переплетение во время загрузки с использованием @EnableLoadTimeWeaving и @Configurable в сгенерированном классе.
Можно ли внедрить bean-компоненты Spring в класс, который генерируется внутри путем отражения и не управляется контейнером Spring?
ИЗМЕНИТЬ:
Вот метод, который создает экземпляр класса evitor:
...
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) {
...
Вот метод запуска, выполняемый в потоке с заданным интервалом:
...
@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
}