Как переписать бины сервиса Spring по имени, используя только аннотации - PullRequest
6 голосов
/ 07 апреля 2011

Учитывая, что у меня bean-компонент Spring настроен как

@Service("myService")
public class DefaultService extends MyService {
}

и класс, использующий этот боб

public class Consumer {
    @Autowired
    @Qualifier("myService")
    private MyService service;
    ...
}

Теперь я хочу, чтобы в моем проекте, включающем предыдущие классы, Consumer была внедрена еще одна реализация MyService. Поэтому я хотел бы переписать боб myService

@Service("myService")
public class SpecializedService implements MyService {
}

в результате Consumer теперь переносит экземпляр SpecializedService вместо DefaultService. По определению я не могу иметь два bean-компонента с одинаковым именем в контейнере Spring. Как я могу сказать весне, что определение нового сервиса перезапишет старый? Я не хочу изменять класс Consumer.

Ответы [ 4 ]

2 голосов
/ 07 апреля 2011

Исключить его из компонентного сканирования с помощью фильтра

<component-scan base-package="your-package">
    <exclude-filter type="regex" expression="DefaultService" />
</component-scan>

Не уверен, есть ли способ сделать это только с помощью аннотаций (кроме удаления аннотации @Service из DefaultService).

2 голосов
/ 07 апреля 2011

Либо определите компонент службы явно

<bean id="myService" class="x.y.z.SpecializedService" />

, либо просканируйте его компонентом.

В любом случае, в контексте вашего приложения, избегайте явного определения DefaultService и не сканируйте его компонентом.

0 голосов
/ 21 сентября 2017

Я знаю, уже поздно. Все еще отправляю это.

У вас должны быть разные имена для разных реализаций MyService.

Например

@Service("mySpecializedService")
public class SpecializedService implements MyService {
}

@Service("myService")
public class DefaultService extends MyService {
 }

При автоматическом подключении (скажем, в контроллере) вы можете использовать @Qualifier для внедрения желаемой реализации, как указано ниже.

Чтобы получить реализацию по умолчанию

@Autowired
@Qualifier("myService")
MyService myService;   

Чтобы получить специализированную реализацию

@Autowired
@Qualifier("mySpecializedService")
MyService myService;
0 голосов
/ 25 декабря 2014

Подключение на основе аннотации происходит до конфигурации на основе XML, это означает, что bean-компоненты, определенные в XML, будут перезаписать проводку, выполненную аннотациями. Так что определение его явно в XML, как сказал Вилли, сработает

<bean id="myService" class="x.y.z.SpecializedService" />

Spring рекомендует использовать XML для bean-компонентов сервиса и репозитория и аннотации для bean-компонентов MVC. Он также рекомендует @Autowired без сканирования компонентов. Но аннотации в целом приветствуются, хотя они объединяют код и конфигурацию вместе (против разделения проблем).

Во-вторых, используйте @Qualifiers («идентификатор объявленного компонента») там, где он передается.

...