《小马哥讲Spring核心编程思想》-第四章Spring Bean基础(1)

定义Bean:什么是BeanDefinition?

BeanDefinition 是 SpringFramework 中定义 Bean 的配置元信息接口,包含:

  1. Bean 的类名;
  2. Bean 行为配置元素,如作用域、自动绑定的模式,生命周期回调等;
  3. 其他 Bean 引用,又可称作合作者(collaborators)或者依赖(dependencies)
  4. 配置设置,比如 Bean 属性(Properties)

BeanDefinition元信息:除了Bean名称和类名,还有哪些Bean元信息值得关注?

BeanDefinition元信息

属性(Property)说明
ClassBean 全类名,必须是具体类,不能用抽象类或接口
NameBean 的名称或者 ID
ScopeBean 的作用域(如:singleton、prototype 等)
Constructor argumentsBean 构造器参数(用于依赖注入)
PropertiesBean 属性设置(用于依赖注入)
Autowiring modeBean 自动绑定模式(如:通过名称 byName)
Lazy initialization modeBean 延迟初始化模式(延迟和非延迟)
Initialization methodBean 初始化回调方法名称
Destruction methodBean 销毁回调方法名称

BeanDefinition 构建

  1. 通过 BeanDefinitionBuilder
  2. 通过 AbstractBeanDefinition 以及派生类

命名SpringBean:id和name属性命名Bean,哪个更好?

Bean 的名称

  1. 每个 Bean 拥有一个或多个标识符(identifiers),这些标识符在 Bean 所在的容器必须是唯一的。通常,一个 Bean 仅有一个标识符,如果需要额外的,可考虑使用别名(Alias)来扩充;
  2. 在基于 XML 的配置元信息中,开发人员可用 id 或者 name 属性来规定 Bean 的 标识符。通常Bean 的 标识符由字母组成,允许出现特殊字符。如果要想引入 Bean 的别名的话,可在name 属性使用半角逗号(“,”)或分号(“;”) 来间隔;
  3. 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)的价值

  1. 复用现有的 BeanDefinition
  2. 更具有场景化的命名方法,比如:
// 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

  1. Java API 配置元信息
    • 命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
    • 非命名方式:
    BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,Be
    anDefinitionRegistry)
    • 配置类方式:AnnotatedBeanDefinitionReader#register(Class…)
    外部单例对象注册
  2. Java API 配置元信息
    • SingletonBeanRegistry#registerSingleton
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页