Как внедрить бины Spring в класс, сгенерированный отражением в потоке класса Apache Commons Pooling

Я использую Spring MVC 3.2.4 и Apache Commons Pooling 2.3 для управления подключениями к сервису SOAP. Одна из вещей, которую я использую, - это функция потока "выселение пустых объектов" в классе 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

После проверки реализации пула 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 метод есть). Поэтому мое предложение простое (хотя и не очень хорошее):

  1. Сделайте нужный вам боб пружины доступным через некоторый статический метод / поле (шаблон синглтона) и установите его во время инициализации пружины.
  2. Создайте нормальный (не пружинный) класс, который получит этот bean-компонент через этот статический метод и вызовет необходимые проверки.
  3. Зарегистрируйте этот класс с помощью Apache Commons.
Другие вопросы по тегам