Могу ли я расширить @Component, создать еще один класс @Component и сделать доступным только один класс за один раз? - PullRequest
0 голосов
/ 13 июня 2019

У меня есть библиотека jar, которую я хочу предоставить ряду приложений.Я хочу создать в библиотеке общий класс компонентов Spring.Если в приложениях один и тот же компонент не расширен, используйте общий компонент;если он расширен в приложении, используйте расширенный компонент (дочерний класс).Это возможно?- Создать CommonComponent, только если дочерний элемент для этого класса не существует.

Я использую Java 1.8, Springboot2.0

Создан класс в библиотеке:

@Component
public class CommonComponent{}

В одном из дочерних приложений, использующих библиотеку, я добавил дочерний компонент:

@Component
public class ChildComponent extends CommonComponent{}

Я ожидал, что будет создан один компонент ChildComponent;но в приведенном выше сценарии создаются 2 компонента - CommonComponent и ChildComponent.

Ответы [ 2 ]

4 голосов
/ 13 июня 2019

Один из способов сделать это - воспользоваться аннотацией @ConditionalOnMissingBean, которая есть у Spring Boot. В сочетании с определением bean-компонента в классе @Configuration мы можем указать Spring только определять наш bean-компонент, если у него его еще нет.

Это не проверено:

@Configuration
public class CustomComponentConfiguration {

    @ConditionalOnMissingBean(CustomComponent.class)
    @Bean
    public CustomComponent customComponent() {
        return new CustomComponent();
    }
}

В этом примере, когда работает @Configuration, Spring определяет, есть ли другой компонент, CustomComponent. Если нет, он выполняет метод customComponent() и определяет любой компонент, который вы возвращаете. Поэтому, если кто-то еще определит ChildComponent, этот метод не будет вызван.

1 голос
/ 13 июня 2019

при создании дочернего компонента вставьте @Primary аннотация

Указывает, что бобу следует отдавать предпочтение, когда несколько кандидатов имеют право на автоматическое связывание однозначной зависимости

так что у вас будет

@Primary
@Component
public class ChildComponent extends CommonComponent { /* ... */ }

и в ваших сервисах autowire CommonComponent type и spring впрыснет ChildComponent или CommonComponent

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...