Spring BeanBean名称生成策略
1. 前言
1. 前言
Spring容器中,每一个Bean都必须要有一个唯一的名称,这个名称就是Bean在容器中的唯一标识,查找或者修改Bean的都必须要通过Bean名称这个唯一索引进行(我们知道Spring容器可以通过Bean名称和类型查找Bean,即使是按照Bean的类型查找Bean,也会先根据Bean的类型查找Bean的名称,然后再根据bean名称查找Bean)。 那么这个Bean名称是怎么生成的呢?这就是本文简述的重点内容,这个阶段在Spring容器启动过程中的步骤如下图中的红色方框部分所示。
大家需要注意区分Bean名称和别称之间的区别,一个Bean有且只有一个Bean名称,一个Bean名称可以有多个别称。
2. Bean名称生成策略
Spring容器中,有特定的接口用于产生Bean的名称,这个接口就是BeanNameGenerator
,Spring容器默认提供了三种实现方式,分别是、默认Bean名称生成策略DefaultBeanNameGenerator
、用于生成注解Bean名称的AnnotationBeanNameGenerator
和类全称的bean名称策略FullyQualifiedAnnotationBeanNameGenerator
, 下文将重点介绍者三中Bean名称生成策略。
/**
* Strategy interface for generating bean names for bean definitions.
*/
public interface BeanNameGenerator {
/**
* Generate a bean name for the given bean definition.
*/
String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry);
}
2.1 默认Bean名称生成策略
默认Bean生产策略只有在xml格式的Spring容器中会用到,SpringBoot项目中基本不会使用。默认Bean生产策略的类名是DefaultBeanNameGenerator
,该Bean的名称生成策略比较简单,Bean的名称由两部分组成:Bean的前缀名称+序号:
- Bean的前缀名称:Bean的前缀名称通常是Bean的Class名称,但是也会有特殊情况下Bean定义没有Class名称,那么会使用以下前缀:1. 如果Bean是FactoryBean,那么Bean的前缀是FactoryBean的名称+ “$created”;2. 如果Bean定义有父Bean定义,那么Bean的前缀名称是父Bean定义的名称+ “$child”;
- Bean的序号:假设我们定义了两个类名称相同的Bean,Spring如何确保Bean名称的唯一性呢?