第四章 Spring Bean基础(1)
定义Bean:什么是BeanDefinition?
BeanDefinition 是 SpringFramework 中定义 Bean 的配置元信息接口,包含:
- Bean 的类名;
- Bean 行为配置元素,如作用域、自动绑定的模式,生命周期回调等;
- 其他 Bean 引用,又可称作合作者(collaborators)或者依赖(dependencies)
- 配置设置,比如 Bean 属性(Properties)
BeanDefinition元信息:除了Bean名称和类名,还有哪些Bean元信息值得关注?
BeanDefinition元信息
属性(Property) | 说明 |
---|---|
Class | Bean 全类名,必须是具体类,不能用抽象类或接口 |
Name | Bean 的名称或者 ID |
Scope | Bean 的作用域(如:singleton、prototype 等) |
Constructor arguments | Bean 构造器参数(用于依赖注入) |
Properties | Bean 属性设置(用于依赖注入) |
Autowiring mode | Bean 自动绑定模式(如:通过名称 byName) |
Lazy initialization mode | Bean 延迟初始化模式(延迟和非延迟) |
Initialization method | Bean 初始化回调方法名称 |
Destruction method | Bean 销毁回调方法名称 |
BeanDefinition 构建
- 通过 BeanDefinitionBuilder
- 通过 AbstractBeanDefinition 以及派生类
命名SpringBean:id和name属性命名Bean,哪个更好?
Bean 的名称
- 每个 Bean 拥有一个或多个标识符(identifiers),这些标识符在 Bean 所在的容器必须是唯一的。通常,一个 Bean 仅有一个标识符,如果需要额外的,可考虑使用别名(Alias)来扩充;
- 在基于 XML 的配置元信息中,开发人员可用 id 或者 name 属性来规定 Bean 的 标识符。通常Bean 的 标识符由字母组成,允许出现特殊字符。如果要想引入 Bean 的别名的话,可在name 属性使用半角逗号(“,”)或分号(“;”) 来间隔;
- Bean 的 id 或 name 属性并非必须制定,如果留空的话,容器会为 Bean 自动生成一个唯一的名称。Bean 的命名尽管没有限制,不过官方建议采用驼峰的方式,更符合 Java 的命名约定。
Bean 名称生成器(BeanNameGenerator)
• 由 Spring Framework 2.0.3 引入,框架內建两种实现:
DefaultBeanNameGenerator:默认通用 BeanNameGenerator 实现
• AnnotationBeanNameGenerator:基于注解扫描的 BeanNameGenerator 实现,起始于Spring Framework 2.5。
SpringBean的别名:为什么命名Bean还需要别名?
Bean 别名(Alias)的价值
- 复用现有的 BeanDefinition
- 更具有场景化的命名方法,比如:
// An highlighted block
<alias name="myApp-dataSource" alias="subsystemA-dataSource"/>
<alias name="myApp-dataSource" alias="subsystemB-dataSource"/>
注册SpringBean:如何将BeanDefinition注册到IoC容器?
BeanDefinition 注册
3. XML 配置元信息
4. Java 注解配置元信息
• @Bean
• @Component
• @Import
- Java API 配置元信息
• 命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
• 非命名方式:
BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,Be
anDefinitionRegistry)
• 配置类方式:AnnotatedBeanDefinitionReader#register(Class…)
外部单例对象注册 - Java API 配置元信息
• SingletonBeanRegistry#registerSingleton