Spring Bean基础笔记

Dcr 1年前 ⋅ 1288 阅读

定义Spring Bean

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

  • Bean的类名
  • Bean行为配置元素,如作用域,自动绑定的模式,生命周期回调等
  • 其他Bean引用
  • 配置设置,比如Bean属性(Properties)

BeanDefinition元信息

  1. Class 全类名,必须是具体类
  2. Name Bean的名称或者ID
  3. Scope 作用域如:singleton,prototype等
  4. Constructor arguments 构造器参数(用于依赖注入)
  5. Properties 属性设置
  6. Autowiring mode 自动绑定模式(如:通过名称)
  7. Lazy initialization mode 延迟初始化模式
  8. Initialization mode 初始化回调方法名称
  9. Destruction method 销毁回调方法名称

BeanDefinition 构建

  • 通过BeanDefinitionBuilder
  • 通过AbstractBeanDefinition以及派生类

命名Spring Bean

每个Bean可以拥有一个或者多个标识符

Spring Bean别名

Bean 别名(Alias)的价值

  • 复用现有的BeanDefinition
  • 更具有场景化的命名方法,比如
<alias name="myApp-dataSource" alias="subsystemA-dataSource"/>
<alias name="myApp-dataSource" alias="subsystemB-dataSource"/>

注册Spring Bean

BeanDefinition注册

  • XML配置元信息 - <bean name=""...>
  • Java注解配置元信息 - @Bean,@Component,@Import
  • Java API配置元信息 ** 命名方式: BeanDefinitionRegistry#registerBeanDefinition ** 非命名方式: BeanDefinitionReaderUtils#registerWithGeneratedName ** 配置类方式: AnnotetedBeanDefinitionReader#register

实例化Spring Bean

常规方式

  • 通过构造器(配置元信息: XML,JAVA注解,JAVA API)
  • 通过静态工厂方法(配置元信息: XML和JAVA API)
  • 通过Bean工厂方法(配置元信息: XML和JAVA API)
  • 通过FactoryBean(配置元信息: XML,JAVA注解和JAVA API)

特殊方式

  • 通过 ServiceLoaderFactoryBean(配置元信息: XML,JAVA注解和JAVA API)
  • 通过AutowireCapableBeanFactory#createBean
  • 通过BeanDefinitionRegistry#registerBeanDefinition

初始化Spring Bean

  • @PostConstrust标注方法
  • 实现InitializingBean接口的afterPropertiesSet()方法
  • 自定义初始化方法 ** XML配置: <bean init-mithod="init" .../> ** Java注解:@Bean(initMethod="init") ** Java API: AbstractBeanDefinition#setInitMethodName(String)

执行顺序: PostConstrust > Initializing#afterPropertiesSet > 注解@Bean(initMethod)

延迟初始化Spring Bean

  • XML 配置: <bean lazy-init="true" ...>
  • Java 注解: @Lazy(true)

销毁Spring Bean

  • @PreDestroy 标注方法
  • 实现DisposableBean接口的destroy()方法
  • 自定义销毁方法 ** XML配置:<bean destory="destroy".../> ** JAVA 注解: @Bean(destroy="destroy") ** JAVA API: AbstractBeanDefinition#setDestroyMethodName(String)

销毁方法执行顺序: @preDestroy > DisposableBean#destroy > 自定义销毁方法 由应用上下文关闭时触发

垃圾回收 Spring Bean

  • 关闭Spring容器(应用上下文)
  • 执行GC
  • Spring Bean 覆盖的finalize()方法被回调

全部评论: 0

    我有话说: