Я создаю весеннее загрузочное приложение, которое должно поддерживать несколько клиентов. В настоящее время у меня есть общая логика, определенная в родительском проекте, и настройки в дочернем проекте. В некоторых случаях клиенты могут запрашивать дополнительные функции или могут нуждаться в дополнительной настройке существующей функции, которая определена для этого дочернего элемента с помощью аннотации @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>
может использоваться для фильтрации кода отдельно от ресурсов.