我有一个现有的Grails应用程序,我在Spring中重写。我的Grails应用程序(例如简化)有2个plugins,UserProfilePlugin
和UserOrderPlugin
,其中每个插件都有自己的代码+配置+资源。根据客户的请求,我可以生成一个编译/打包的应用程序,包括:
UserProfilePlugin
和UserOrderPlugin
都显示用户个人资料和用户订单UserProfilePlugin
仅显示用户个人资料UserOrderPlugin
仅显示用户订单我希望模块化我的Spring应用程序,使其具有多个代码+配置+资源单元,这些单元可以在编译/打包时包含在主应用程序中/从主应用程序中排除,并且可以在多个应用程序中重复使用。但是我很难找到Spring相当于Grails plugin。我已经阅读了Spring的官方文档1,2,3,4等,但找不到任何有用的内容。相反,Spring应用程序(根据文档)看起来更像是一个整体单元,里面没有可重复使用的子单元。
我错过了一些明显的东西吗?有人可以对此有所了解吗?
答案 0 :(得分:0)
Spring没有这样的概念,但有几种方法可以实现它。 最简单的方法可能是在应用程序中进行组件扫描,从而从可选包中获取所有组件。
假设你的“模块”定义了一个顶级包“com.yourcompany.yourapp.module”,那么你只需要确保同一个应用程序的所有其他部分都在“com.yourcompany.yourapp”下面。并将组件扫描设置为“com.yourcompany.yourapp”。
如果您不是组件扫描的忠实粉丝,我能想到的最简洁的方法是Java ServiceLoader
SPI。您可以定义一个用Spring注册的接口,例如
public interface SpringConfig{
void register(ApplicationContext ac);
}
(我相信你可以改进这个设计)
无论如何,在每个模块中,你都有一个名为
的文件
/META-INF/services/com.yourcompany.yourapp.SpringConfig
列出了该模块所有的实现。在您的中央应用程序中,您可以拥有一个初始化模块的组件:
@Component
public class ModuleInitializer implements ApplicationContextAware, InitializingBean {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(final ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Override
public void afterPropertiesSet() throws Exception {
for (SpringConfig springConfig : ServiceLoader.load(SpringConfig.class)) {
springConfig.register(applicationContext);
}
}
}
在这两个版本中,您可以通过将模块添加到类路径中/从模块路径中删除模块来启用/禁用模块。因此,最简单的方法是为每个应用程序模块提供一个构建工件(例如Maven模块)