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