定义Spring Bean
BeanDefinition是Spring Framework中定义Bean的配置元信息接口,包含
- Bean的类名
- Bean行为配置元素,如作用域,自动绑定的模式,生命周期回调等
- 其他Bean引用
- 配置设置,比如Bean属性(Properties)
BeanDefinition元信息
- Class 全类名,必须是具体类
- Name Bean的名称或者ID
- Scope 作用域如:singleton,prototype等
- Constructor arguments 构造器参数(用于依赖注入)
- Properties 属性设置
- Autowiring mode 自动绑定模式(如:通过名称)
- Lazy initialization mode 延迟初始化模式
- Initialization mode 初始化回调方法名称
- 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()方法被回调