Можно ли у аннотации @Service задавать имя бина
Что проверяют
Знаете ли вы, что стереотипные аннотации это @Component под другим именем, и понимаете ли, откуда берётся имя бина и когда оно вообще важно.
Как отвечать
Да, можно. У аннотации ровно один атрибут value, объявленный как @AliasFor для @Component#value, отдельного атрибута name у неё нет.
@Service("legacyOrderService")
public class OrderServiceImpl implements OrderService { }Если имя не задано, его выдаёт AnnotationBeanNameGenerator: берётся короткое имя класса и первая буква переводится в нижний регистр через Introspector.decapitalize. Отсюда OrderServiceImpl даёт orderServiceImpl, а класс, начинающийся с двух заглавных, например URLService, имя не меняет.
Имя нужно там, где одного типа мало: @Qualifier, @Resource, ссылка из SpEL или XML, получение бина по имени, две реализации одного интерфейса. Стоит добавить, что для контейнера @Service и @Component почти неразличимы, разница смысловая, а вот у @Repository есть настоящий эффект: перевод исключений драйвера в иерархию DataAccessException.
Где спотыкаются
Дают двум бинам одинаковое имя и ждут, что победит нужный. В Spring Boot переопределение по умолчанию выключено, и приложение падает на старте с BeanDefinitionOverrideException; при включённом переопределении молча остаётся один бин, и не обязательно тот.
Думают, что внедрение идёт по имени. Оно идёт по типу, а имя вступает в игру только при нескольких кандидатах: тогда работают @Qualifier, @Primary или совпадение имени поля с именем бина.
Вешают аннотацию и создают объект через new. Контейнер такой экземпляр не видит, а значит не работают ни @Transactional, ни @Cacheable, ни любой другой аспект: их даёт прокси, который строит контейнер.