У меня есть веб-приложение, работающее со стандартным импортом бэкэнд-сервиса. Нужно иметь возможность реализовать интерфейс и отбросить банку в папку плагинов (чего нет в пути к классам приложений). После перезапуска сервера идея состоит в том, чтобы загрузить новую банку в загрузчик классов и принять участие в инъекции зависимостей. Я использую Spring DI, используя @Autowired. Новый модуль плагина будет иметь @Primary аннотацию. Поэтому, учитывая два интерфейса интерфейса, первичный должен быть загружен.
Я получил флягу, загруженную в загрузчик классов, и могу вызвать ее вручную. Но я не смог принять участие в Injection Dependency и заменить его по умолчанию.
Здесь приведен упрощенный пример:
@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>
Даже после того, как я загрузил jar в загрузчик классов, DefaultService все еще вводится как служба. Любая идея, как я получаю банку плагина для участия в жизненном цикле Spring DI?
Отредактировано: Проще говоря, у меня есть файл войны, в котором есть несколько плагинов в каталоге плагинов внутри войны. Основываясь на значении из файла конфигурации, на которое приложение смотрит, когда приложение запущено, я хочу загрузить эту конкретную банку с плагином и запустить приложение с ней. Таким образом, я могу распределить войну кому угодно, и они могут выбрать, какой плагин запускаться на основе значения конфигурации, не переупаковывая все. Это проблема, которую я пытаюсь решить.