spring · 8 5 月, 2021 0

Spring Bean 基础

Spring Bean 基础

什么是BeanDefinition


  • 定义Bean的配置元信息接口

    • Bean的类名

    • Bean的行为配置元素,如作用域,自动绑定的模式,生命周期回调等

    • 其他Bean引用,有可称作合作者(Collaborators)或者依赖(Dependencies)

    • 配置设置,比如Bean属性(Properties)

BeanDefinition元信息


属性 说明
Class Bean全类名,必须是具体类,不能用抽象类或接口
Name Bean的名称或者ID
Constructor arguments Bean构造器参数
Properties Bean属性设置
Autowiring mode Bean 自动绑定模式
Lazy initialization mode Bean延迟初始化模式
Initialization method Bean初始化回调方法
Destruction method Bean销毁回调方法

BeanDefinition构建


  • BeanDefinitionBuilder

  • AbstractBeanDefinition

命名Spring Bean

每个Bean拥有一个或多个标识符(identifiers), 这些标识符在Bean所在的容器必须是唯一的,通常,一个Bean仅有一个表示符,如果 需要额外的,可以考虑使用别名(Alias)来扩充

在基于XML的配置元信息中,开发人员可用id或者name属性来规定Bean的标识符。通常Bean的标识符由字母组成,允许出现特殊字符。如果想引入Bean的别名的话,可在name属性使用半角逗号(",")分号(";")来间隔.

Bean的id或name属性并非必须制定,如果留空, 容器会为Bean自动生成一个唯一的名称。Bean的命名尽管没有限制,不过官方建议使用驼峰的方式。更符合Java的命名约定。

Bean别名


  • 通过alias的方式指定

注册Spring Bean


  • BeanDefinition注册

    • XML配置元信息

      • <bean name="" .../>

    • Java注解配置元信息

      • @Bean

      • @Component

      • @Import

    • Java API配置元信息

      • 命名方式: BeanDefinitionRegistry#registerBeanDefinition(String, BeanDefinition)

      • 非命名方式

        • BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition, BeanDefinitionRegistry)

      • 配置类方式

        • AnnotatedBeanDefinitionReader#register(Class)

实例化Spring Bean


  • Bean实例化

    • 常规方式

      • 通过构造器(配置元信息: XML, Java注解和Java API)

      • 通过静态工厂方法(配置元信息: XML和Java API)

      • 通过Bean工厂方法(配置元信息: XML和Java API)

      • 通过FactoryBean(配置元信息: XML, Java注解和Java API)

    • 特殊方式

      • 通过ServiceLoaderFactoryBean(配置元信息: XML, Java注解和Java API)

      • 通过AutowireCapableBeanFactory#createBean(Class, int, boolean)

      • 通过BeanDefinitionRegistry#regsiterBeanDefinition(String, BeanDefinition)

初始化Spring Bean


  • Bean 初始化(Initialization)

    • @PostConstruct 标注方法

    • 实现InitializingBean接口的afterPropertiesSet()方法

    • 自定义初始化方法:

      • XML配置: <bean init-method="init">

      • Java注解: @Bean(initMethod="init")

      • Java API: AbstractBeanDefinition@setInitMethodName(String)

假设这三种方式在同一个BEAN中,执行顺序是什么?

  • @PostConstruct注解

  • InitializingBean#afterPropertiesSet()

  • 自定义初始化方法

延迟初始化Spring Bean


  • Bean 延迟初始化(Lazy Initialization)

    • XML配置: <bean lazy-init=”true”>

    • Java注解:@Lazy(true)

销毁Spring Bean


  • Bean销毁(Destroy)

    • @PreDestroy 标注方法

    • 实现DesposableBean接口的destroy()方法

    • 自定义销毁方法

      • XML配置<bean destroy="destroy">

      • Java注解: @Bean(desctroy="destroy")

      • Java API: AbstractBeanDefinition#setDestroyMethodName(String)

垃圾回收Spring Bean


  • Bean 垃圾回收(GC)

    • 关闭Spring容器(应用上下文)

    • 执行GC

    • Spring Bean覆盖finalize()方法被回调

问题列表


  1. Spring如何注册一个Bean

答: 主要用过BeanDefinition外部单体对象注册

  1. 什么是Spring BeanDefinition?

答: 管理JavaBean元数据信息