我正在构建一个应支持多个客户端的 Spring Boot 应用程序。目前,我在父项目中定义了通用逻辑,并在子项目中进行了自定义。在某些情况下,客户可能会要求额外的功能,或者可能需要对使用 @Primary
在此子项中定义的现有功能进行额外的自定义。注解。
这里的想法是将核心逻辑和自定义分开。
目前,我们正在子项目中为不同的客户创建不同的分支,并且在那些不是最佳解决方案的项目中进行自定义。随着客户数量的增加,分支机构的数量也会增加。
我想要一个代码,我将在其中定义所有客户端的所有自定义,并且每个客户端可用的功能应该是可控的。
我知道这可以通过使用配置文件来实现。但即使在这种情况下,我仍然必须为所有组件注释定义配置文件,这很麻烦。
所以最近我想到了使用 @Componentscan
的想法使用属性来控制具有以下目录结构的客户端逻辑。
父级:
.
└── src
└── main
└── java
├── com.test.parent.controller
├── com.test.parent.dao
└── com.test.parent.service
子级:
.
└── src
└── main
└── java
├── com.test.child.client1.controller
├── com.test.child.client1.dao
├── com.test.child.client1.service
├── com.test.child.client2.controller
├── com.test.child.client2.dao
├── com.test.child.client2.service
├── com.test.child.client3.controller
├── com.test.child.client3.dao
└── com.test.child.client3.service
Mainclass.java
package com.test.child;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan(basePackages = { "com.test.parent.*","com.test.child.${clientname:default}.*" })
public class MainClass {
public static void main(String[] args) {
SpringApplication.run(MainClass.class, args);
}
}
但即使如此,在这种情况下,我也通过使用属性 clientname
来控制客户端自定义。并且通过传递其他客户的名称存在暴露其他客户的定制的风险。
- 是否可以控制包裹或
mvn package
期间要包含或排除的业务逻辑或mvn install
本身前提是代码保持单一? 即在构建时而不是运行时隔离逻辑。 - 似乎
maven-compiler-plugin
插件通过指定includes
提供此类功能以及pattern
。但如何在spring-boot-maven-plugin
中做同样的事情?这样构建就可以在mvn package
期间通过传递属性来控制。或mvn install
?
所以基本上我正在寻找类似过滤器的东西,它支持在 mvn 构建生命周期期间包含/排除包/代码的模式。
不确定<resources><resource>..<\resources><\resource>
可用于过滤除资源之外的代码。
最佳答案
The Spring Boot auto-configuration mechanism能够在运行时自动检测类路径上的自动配置类并将它们导入到上下文中(有时使用条件来决定是否这样做)。
就您而言,听起来一个可靠的方法是将您的常规 Spring Boot 应用程序编写并打包为单个共享 jar。然后每个客户端的特定代码将存在于声明 Client1AutoConfiguration
的“插件”jar 中。 ;启动应用程序时,tell Boot to also load the plugin jar .
如果您的主 jar 中有默认值需要在插件中覆盖,请使用 @ConditionalOnMissingBean
(请参阅 DataSourceAutoConfiguration
作为一个很好的示例)并使用 @AutoConfigureBefore(MainAutoConfiguration.class)
注释您的插件自动配置类.
关于java - Spring boot Multi-Tenancy 代码,具有隔离的客户端特定隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56456328/