Весенний динамический автосервис
Я начал создавать какую-то CMS и застрял на одной идее.
Описание:
У меня есть стандартный контроллер MVC (Home), в котором я загружаю настройки модулей, которые будут установлены в этом контроллере.
В ответ я должен реализовать модуль с именем "HPModule".
Поэтому я пытаюсь загрузить этот модуль Class.forName("com.app.something.HPModule");
а затем вызвать метод init();
Мой HPModule это:
public class HPModule
{
@Resource(name = "hpModuleService")
private HPModuleService hpModuleService;
public String init()
{
SomeObject someObject = hpModuleService.getArticle();
}
}
И я обнаружил, что когда я пытаюсь сделать SomeObject someObject = hpModuleService.getArticle();
Весна слепа для @Resource
когда я звоню в класс Class.forName
,
Как решить эту проблему?
1 ответ
HPModule
должен быть Spring Bean, полученным с помощью DI
или прямо из весны BeanFactory
, Вы не можете ожидать, что Spring автоматически связывает класс, который не был создан Spring, если вы не используете @Configurable
а также AspectJ
ткать класс.
Если HPModule
уже является бобом, чем просто @Autowire
или же @Inject
это непосредственно в контроллер MVC, который нуждается в этом.
Если вы не знаете во время компиляции, какие модули вам понадобятся, чем внедрить ListableBeanFactory
и использовать BeanFactoryUtils
чтобы получить нужные вам модули во время выполнения по типу или по имени.