Сканирование компонентов с использованием пользовательских аннотаций
Я использую проект весенней загрузки как jar внутри другого приложения весенней загрузки, используя зависимость maven. Я хочу сделать компонентное сканирование jar, только если я включу пользовательскую аннотацию из микросервиса.
@SpringBootApplication
//@ComponentScan({"com.jwt.security.*"}) To be removed by custom annotation
@MyCustomAnnotation //If I provide this annotation then the security configuration of the jar should be enabled.
public class MicroserviceApplication1 {
public static void main(String[] args) throws Exception {
SpringApplication.run(MicroserviceApplication1.class, args);
}
}
Пожалуйста, предложите несколько идей.
2 ответа
В вашей библиотеке:
@Configuration
@ComponentScan(basePackages = { "com.jwt.security" })
public class MyCustomLibConfig{
}
@Retention(RUNTIME)
@Target(TYPE)
@Import(MyCustomLibConfig.class)
public @interface MyCustomAnnotation{
@AliasFor(annotation = Import.class, attribute = "value")
Class<?>[] value() default { MyCustomLibConfig.class };
}
Итак, в вашем приложении вы можете использовать аннотацию
@SpringBootApplication
@MyCustomAnnotation //If I provide this annotation then the security configuration
of the jar should be enabled.
public class MicroserviceApplication1 {
public static void main(String[] args) throws Exception {
SpringApplication.run(MicroserviceApplication1.class, args);
}
}
Ты можешь использовать @Conditional
определить конфигурации (см. пример, описанный здесь). Некоторый код из источника
@Configuration
public class MyConfiguration {
@Bean(name="emailerService")
@Conditional(WindowsCondition.class)
public EmailService windowsEmailerService(){
return new WindowsEmailService();
}
@Bean(name="emailerService")
@Conditional(LinuxCondition.class)
public EmailService linuxEmailerService(){
return new LinuxEmailService();
}
}
и условно
public class WindowsCondition implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("os.name").contains("Windows");
}
}
Вы можете использовать профили. Просто добавьте @Profile
в ваш класс конфигурации с проверкой желаемого пакета.
Еще одна альтернатива описана здесь.
@AutoconfigureAfter(B.class)
@ConditionalOnBean(B.class)
public class A123AutoConfiguration { ...}