我已经开始构建某种类型的CMS,但我仍然坚持一个想法。
描述如下:
我有标准MVC控制器(Home),其中我正在下载将在此Controller中设置的模块设置。
响应是,我必须实现名为“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
是盲目的。
如何解决这个问题?
答案 0 :(得分:2)
HPModule
必须是通过DI
或直接从Spring BeanFactory
检索的Spring Bean。你不能指望Spring自动装配一个没有被Spring实例化的类,除非你使用@Configurable
和AspectJ
来编织类。
如果HPModule
已经是一个Spring Bean,而不仅仅是@Autowire
或@Inject
它直接进入需要它的MVC控制器。
如果您在编译时不知道您需要哪些模块,而不是注入ListableBeanFactory
并使用BeanFactoryUtils
来获取运行时按类型或名称所需的模块。