Spring Dependency Injection и Plugin Jar

У меня есть веб-приложение, работающее с имплантацией серверной службы по умолчанию. Следует иметь возможность реализовать интерфейс и поместить банку в папку плагинов (которой нет в пути к классам приложений).Идея состоит в том, чтобы после перезапуска сервера загрузить новую банку в загрузчик классов и заставить ее участвовать во внедрении зависимостей. Я использую Spring DI с помощью @Autowired. Новая служба плагина impl будет иметь аннотацию @Primary. Итак, учитывая два импликации интерфейса, должен быть загружен основной.

Я загрузил jar в загрузчик классов и могу вызвать impl вручную. Но мне не удалось принять участие в внедрении зависимостей и заменить им стандартный файл impl.

Вот упрощенный пример:

@Controller
public class MyController {
   @Autowired
   Service service;
}

//default.jar
@Service
DefaultService implements Service {
   public void print() {
       System.out.println("printing DefaultService.print()");
   } 
}

//plugin.jar not in classpath yet
@Service
@Primary
MyNewService implements Service {
   public void print() {
      System.out.println("printing MyNewService.print()");
   } 
}

// Из-за отсутствия лучшего места я загрузил банку плагина из ContextListener

public class PluginContextLoaderListener extends org.springframework.web.context.ContextLoaderListener {

        @Override
        protected void customizeContext(ServletContext servletContext,
                                        ConfigurableWebApplicationContext wac) {
                System.out.println("Init Plugin");
                PluginManager pluginManager = PluginManagerFactory.createPluginManager("plugins");
                pluginManager.init();

                    //Prints the MyNewService.print() method  
                    Service service = (Service) pluginManager.getService("service");
                    service.print();                  
            }
    }

     <listener>
            <listener-class>com.plugin.PluginContextLoaderListener</listener-class>
     </listener>

Даже после того, как я загрузил банку в загрузчик классов, DefaultService все еще внедряется как служба. Есть идеи, как заставить плагин jar участвовать в жизненном цикле Spring DI?

Отредактировано: Проще говоря, у меня есть файл war, в котором есть несколько jar-файлов плагинов в каталоге плагинов внутри war. На основе значения из файла конфигурации, который приложение просматривает, при запуске приложения я хочу загрузить этот конкретный jar-файл плагина и запустить приложение с ним. Таким образом, я могу распространять войну среди всех, и они могут выбирать, какой плагин запускать на основе значения конфигурации, без необходимости переупаковывать все. Это проблема, которую я пытаюсь решить.

13
задан Langali 18 October 2011 в 15:22
поделиться