什么是Spring相当于Grails"插件" (模块化Spring应用程序)

时间:2015-11-23 08:10:00

标签: java spring spring-mvc

背景

我有一个现有的Grails应用程序,我在Spring中重写。我的Grails应用程序(例如简化)有2个pluginsUserProfilePluginUserOrderPlugin,其中每个插件都有自己的代码+配置+资源。根据客户的请求,我可以生成一个编译/打包的应用程序,包括:

  1. UserProfilePluginUserOrderPlugin都显示用户个人资料和用户订单
  2. UserProfilePlugin仅显示用户个人资料
  3. UserOrderPlugin仅显示用户订单
  4. 问题

    我希望模块化我的Spring应用程序,使其具有多个代码+配置+资源单元,这些单元可以在编译/打包时包含在主应用程序中/从主应用程序中排除,并且可以在多个应用程序中重复使用。但是我很难找到Spring相当于Grails plugin。我已经阅读了Spring的官方文档1234等,但找不到任何有用的内容。相反,Spring应用程序(根据文档)看起来更像是一个整体单元,里面没有可重复使用的子单元。

    我错过了一些明显的东西吗?有人可以对此有所了解吗?

1 个答案:

答案 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模块)