Как мне @Autowire перейти в расширенный класс, когда в Spring используется @Qualifier? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть следующие классы:

public class Service
{
    @Autowired
    @Qualifier(Helper.BEAN_NAME)
    protected Helper helper;
...
}

@Component(Helper.BEAN_NAME)
public class Helper
{
    public static final String BEAN_NAME = "Helper";
    ...
}

@Component(Helper.BEAN_NAME)
public class ExtHelper extends Helper
{
    ...
}

Моя цель - не трогать классы Сервис или Помощник.Я думаю, что, дав ExtHelper то же имя бина, что и Helper, Spring будет автоматически связывать реализацию ExtHelper с Service вместо Helper.

Я вижу смешанные результаты с этим.Если ExtHelper включен в мой pom ПОСЛЕ Helper, он работает нормально.Но прежде я получаю исключение ConflictingBeanDefinitionException.Я понимаю исключение, но не то, почему я получаю его, если меняю порядок зависимостей в POM.

Мой основной вопрос заключается в том, правильно ли я делаю это концептуально.Предназначен ли @Qualifier для предотвращения такого рода переопределения автопроводки?Если нет, то каково правило, чтобы Spring разрешил конфликт, выбрав мое расширение вместо базового класса?Должен ли я расширить класс обслуживания, чтобы получить то, что я хочу?Я новичок в Spring и не совсем понимаю, как я должен делать это.

1 Ответ

0 голосов
/ 10 мая 2019

@Qualifier предназначен для указания Spring, какой бин должен быть введен в случае наличия нескольких доступных бинов типа.

В вашем случае у вас есть два бина, которые могут быть введены в атрибут protected Helper helperпоэтому вы должны сказать Spring, какой из них следует использовать.Вы не можете сделать это с @Qualifier, так как оба компонента имеют одинаковое имя.

Если вы не хотите трогать эти классы, вы можете использовать другую аннотацию для определения приоритета бина - @Primary.Добавьте его к ExtHelper, и он будет рассматриваться как предпочтительный bean-компонент в случае, если для инъекции доступно несколько bean-компонентов.

Если вы хотите остаться с @Qualifier, вам необходимо изменить имя одного из этих bean-компонентов.и введите предпочтительный боб:

@Component
public class Service
{
    @Autowired
    @Qualifier("extHelper")
    protected Helper helper; // instance of Helper or ExtHelper could be injected here
    ...
}

@Component // bean will be named using default naming strategy: helper. You can obviously use your own name
public class Helper
{
    ...
}

@Component // bean will be named using default naming strategy: extHelper. You can obviously use your own name
public class ExtHelper extends Helper
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...