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

本文深入探讨了Spring框架中的BeanDefinition,包括它所包含的Bean元信息,如类名、行为配置和依赖。同时,文章讨论了如何命名SpringBean,id和name属性的使用,并解释了为何需要Bean的别名。最后,介绍了如何将BeanDefinition注册到IoC容器的不同方法。

定义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
### 小马哥 Spring 教程解 #### 关于 Spring 框架的教学资源概述 小马哥提供了丰富的 Spring 及其生态系统教学视频,这些资源覆盖了从入门到高级的各种主题。对于希望深入了解 Spring 和微服务架构的学习者来说,这是一个非常有价值的资源库。 #### Spring Boot 和 Spring Cloud 实践指南 针对 Spring Boot 和 Spring Cloud 的具体应用案例进行了详细的介绍[^1]。通过实际操作演示如何构建基于这两个框架的应用程序,使开发者能够快速掌握核心概念和技术要点。例如,在创建新的应用程序时: ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这段简单的代码展示了启动一个 Spring Boot 应用所需的基础结构。 #### 开源项目贡献指导 除了理论知识外,还特别强调了参与开源社区的重要性,并给出了具体的步骤来引导初学者参与到真实的项目当中去[^2]。这对于想要提高编程技能以及建立个人品牌的程序员而言尤为重要。 #### 零基础至进阶全面覆盖 无论是刚刚接触 Java 编程的新手还是已经有一定工作经验的技术人员都能在这里找到适合自己水平的内容[^3]。课程设计注重循序渐进的原则,确保每位学员都能够按照自己的节奏稳步前进。 #### 特定功能详解——@Import 注解 在某些特定场景下使用的 `@Import` 注解也得到了充分解释。值得注意的是,虽然通常情况下被导入的对象会是一个带有 `@Configuration` 标记的类,但这并不是绝对的要求;任何普通的 POJO 类也可以作为目标对象被引入并用于依赖注入的目的[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值