Статьи

Имена бобов

Имена 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.