gpt4 book ai didi

java - Spring 相当于 Grails "plugin"(模块化 Spring 应用程序)

转载 作者:太空宇宙 更新时间:2023-11-04 13:12:03 24 4
gpt4 key购买 nike

背景

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

  1. UserProfilePluginUserOrderPlugin 均用于显示用户个人资料和用户订单
  2. UserProfilePlugin仅显示用户个人资料
  3. UserOrderPlugin仅显示用户订单

问题

我想模块化我的 Spring 应用程序,使其具有多个代码+配置+资源单元,这些单元可以在编译/打包时从主应用程序中包含/排除,并且可以在多个应用程序之间重用。但我正在努力寻找 Spring 的 Grails 等价物 plugin 。我已经浏览过Spring的官方文档1 , 2 , 3 , 4等等,但找不到任何有用的东西。相反,Spring 应用程序(根据文档)看起来更像是一个整体单元,内部没有可重用的子单元。

我是否遗漏了一些明显的东西?有人可以解释一下吗?

最佳答案

Spring没有这样的概念,但是有几种实现方式。最简单的方法可能是在应用程序中进行组件扫描,从可选包中获取所有组件。

假设您的“模块”定义了一个顶级包“com.yourcompany.yourapp.module”,那么您只需确保同一应用程序的所有其他部分都位于“com.yourcompany.yourapp”下方,并将组件扫描设置为“com.yourcompany.yourapp”。

<小时/>

如果您不是组件扫描的忠实粉丝,我能想到的最干净的方法是 Java ServiceLoader SPI 。您可以定义一个向 Spring 进行注册的接口(interface),例如

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

关于java - Spring 相当于 Grails "plugin"(模块化 Spring 应用程序),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33866217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com