Как внедрить bean-компоненты 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#setEvictionPolicyClassName(java.lang.String)

После проверки реализации 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
}

person skel625    schedule 01.02.2015    source источник
comment
можете поделиться кодом?   -  person Haim Raman    schedule 01.02.2015


Ответы (1)


Если я вас правильно понял, у вас есть проблема с "пересечением" не-весенних классов с весенними бобами. Если я правильно понимаю, создание и выполнение этих проверок находятся вне вашего контроля (см. там метод final). Итак, мое предложение простое (хотя и не очень приятное):

  1. Сделайте нужный компонент Spring доступным через какой-либо статический метод/поле (шаблон ~ singleton) и установите его во время инициализации Spring.
  2. Создайте обычный (не весенний) класс, который получит этот компонент с помощью этого статического метода и вызовет необходимые проверки.
  3. Зарегистрируйте этот класс в Apache Commons.
person sodik    schedule 01.02.2015
comment
На самом деле это была моя первая мысль при рассмотрении вариантов, но мне нужен доступ к классам, общим для всего приложения и управляемым Spring. Мне пришлось бы либо создавать повторяющиеся классы, либо преобразовывать все, чтобы они не были управляемыми bean-компонентами Spring, и это не очень хороший вариант. Итак, что я сделал на данный момент, так это передал ссылку на управляемые bean-компоненты spring в класс eviction, который работает хорошо. Я предлагаю изменить Apache Commons, чтобы разрешить передачу класса вытеснения в качестве ссылки, которая позволила бы управлять им Spring. Не уверен, почему сейчас это не так, но я постараюсь выяснить. - person skel625; 05.02.2015