Имена bean-компонентов Spring просты, за исключением случаев, когда имена не указаны явно. Для начала, имена bean-компонентов Spring для определения bean-компонента на основе xml указываются следующим образом:
1
2
3
4
5
|
< bean name = 'sampleService1' class = 'mvcsample.beanname.SampleService' > < constructor-arg > < bean class = 'mvcsample.beanname.SampleDao' ></ bean > </ constructor-arg > </ bean > |
Для определения компонента Java на основе @Configuration имя метода аннотированного метода @Bean становится именем компонента:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
@Configuration @ComponentScan (basePackages= 'mvcsample.beanname' ) public static class SpringConfig{ @Bean public SampleService sampleService(){ return new SampleService(sampleDao()); } @Bean public SampleDao sampleDao(){ return new SampleDao(); } } |
а для компонентов на основе стереотипных аннотаций (@Component, @Service, @Repository и т. д.) поле значения указывает имя компонента:
1
2
3
4
5
6
7
8
9
|
@Repository ( 'aSampleDao' ) public class SampleDao { ... } @Service ( 'aSampleService' ) public class SampleService { ... } |
Теперь, что происходит для случаев, когда имя компонента не указано.
Пример конфигурации bean-компонента на основе XML:
Для конфигурации на основе xml, случай, когда имя bean-компонента обычно не указывается, относится к bean-компонентам, которые могут воздействовать на всю фабрику bean-компонентов — например, для определения BeanPostProcessor или BeanFactoryPostProcessor. Например, для. рассмотрим следующий фиктивный BeanPostProcessor, который просто получает все имена бинов с фабрики бинов:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public class BeanNameScanningBeanPostProcessor implements BeanPostProcessor{ private List<String> beanNames = new ArrayList<>(); @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { beanNames.add(beanName); return bean; } public List<String> getBeanNames(){ return this .beanNames; } } |
Обычно это определяется в конфигурации компонента XML следующим образом:
1
|
< bean class = 'mvcsample.beanname.BeanNameScanningBeanPostProcessor' /> |
Второй случай с конфигурацией на основе xml, где имя обычно не указывается, относится, например, к внутренним компонентам. определено так:
1
2
3
4
5
|
< bean class = 'mvcsample.beanname.SampleService' > < constructor-arg > < bean class = 'mvcsample.beanname.SampleDao' ></ bean > </ constructor-arg > </ bean > |
Имена бинов для этих случаев обрабатываются компонентом, называемым BeanNameGenerator . В случае bean-компонента верхнего уровня имя обычно заканчивается именем класса с указанием пакета вместе со счетчиком экземпляров, таким образом:
1
|
mvcsample.beanname.BeanNameScanningBeanPostProcessor#0 |
В случае внутреннего bean-компонента, поскольку он существует только в области действия содержащего его bean-компонента, имя не имеет такого значения, однако внутренне оно получает имя на основе шестнадцатеричного хэш-кода определения bean-компонента, например, для ‘mvcsample. beanname.SampleDao # 1881ee8b»
Случай @Configuration на основе Java:
Для @Configuration на основе Java, с другой стороны, невозможно указать bean-компонент без имени, имя bean-компонента является именем метода.
Конфигурация на основе аннотации
Для bean-компонента на основе аннотации стереотипа, если имя не указано явно в поле значения аннотаций стереотипа, то имя снова генерируется AnnotationBeanNameGenerator, который является реализацией интерфейса стратегии BeanNameGenerator, сгенерированные имена — это просто краткое имя класса Например, из javadoc для AnnotationBeanNameGenerator — имя компонента для com.xyz.FooServiceImpl становится fooServiceImpl.
Вывод:
Итак, чтобы окончательно заключить, что если имена bean-компонентов имеют какое-то отношение к вам (например, для устранения неоднозначности между несколькими экземплярами bean-компонентов одного типа), то лучше всего четко указывать имена, в противном случае для генерации имен bean-компонентов зависит Spring. вы. В некоторых случаях, например. в проекте Spring-data можно указать пользовательское поведение для репозиториев в виде отдельного компонента и
Spring-data по умолчанию использует соглашения об именах Spring, чтобы найти пользовательскую реализацию и понять, как генерируются имена бинов.
Ссылка: имена Spring Bean от нашего партнера JCG Биджу Кунджуммена в блоге all and sundry.