什么是 BeanDefinition?
BeanDefinition 是SpringFreamwork 定义配置元信息的接口。包含:
• Bean 的类名
• Bean 行为配置元素,如作用域、自动绑定的模式,生命周期回调等
• 其他 Bean 引用,又可称依赖
• 配置设置,比如 Bean
1、BeanDefinition 元信息
属性 | 说明 |
---|---|
Class | Bean 全类名 |
Name | Bean 名称或 ID |
Scope | Bean 作用域范围 |
Constructor Args | Bean 构造器参数(用作依赖注入) |
Properties | Bean 属性 (用作依赖注入) |
Autowiring mode | Bean 自动绑定模式 |
Lazy initiallization mode | Bean 延迟初始化模式 |
Initialization method | Bean 初始化回调方法名称 |
Destruction method | Bean 销毁回调方法名称 |
2、BeanDefinition 构建
- 通过 BeanDefinitionBuilder
// 1. 通过BeanDefinitionBuilder 构建
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);
beanDefinitionBuilder
.addPropertyValue("id","1")
.addPropertyValue("name","张三");
BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();
- 通过 AbstractBeanDefinition 以及派生类
// 2. 通过 AbstractBeanDefinition 派生类构建
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
MutablePropertyValues propertyValues = new MutablePropertyValues();
propertyValues
.add("id","1")
.add("name","张三");
genericBeanDefinition.setPropertyValues(propertyValues);
3、BeanDefinition 命名
每个 Bean 拥有一个或多个标识符(identifiers),这些标识符在 Bean 所在的容器必须是唯一的。通常,一个 Bean 仅有一个标识符,如果需要额外的,可考虑使用别名(Alias)来扩充。
Bean 名称生成器(BeanNameGenerator),框架內建两种实现:
DefaultBeanNameGenerator :默认通用 BeanNameGenerator 实现
AnnotationBeanNameGenerator:基于注解扫描的 BeanNameGenerator 实现
4、BeanDefinition 别名
Bean 别名(Alias)的价值
a、复用现有的 BeanDefinition
b、更具有场景化的命名方法,比如:
5、BeanDefinition 注册
a、XML 配置元信息
<bean name="" …/>
b、JAVA 注解配置元信息
@Bean、@Component、@Import
c、JAVA API 配置元信息
命名方式:BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
非命令方式:
BeanDefinitionReaderUtils#registerWithGeneratedName(AbstractBeanDefinition,BeanDefinitionRegistry)
配置方式:
AnnotatedBeanDefinitionReader#register(Class…)
6、注册 Bean
(1)通过 BeanDefinition
(2)通过 外部单体对象(SingletonBeanRegistry#registerSingleton)
7、实例化 Bean
常规方式
(1)通过构造器(配置元信息:XML、Java 注解和 Java API )
(2)通过静态工厂方法(配置元信息:XML 和 Java API )
(3)通过 Bean 工厂方法(配置元信息:XML和 Java API )
(4)通过 FactoryBean(配置元信息:XML、Java 注解和 Java API )
特殊方式
(1)通过 ServiceLoaderFactoryBean
(2)通过 AutowireCapableBeanFactory#createBean(java.lang.Class, int, boolean)
(3)通过 BeanDefinitionRegistry#registerBeanDefinition(String,BeanDefinition)
8、初始化 Bean
a、 @PostConstruct 标注方法
b、实现 InitializingBean 接口的 afterPropertiesSet() 方法
c、自定义初始化方法
- XML 配置:<bean init-method=”init” … />
- Java 注解:@Bean(initMethod=”init”)
- Java API:AbstractBeanDefinition#setInitMethodName(String)
9、延迟初始化 Bean
a、XML 配置
<bean lazy-init=”true” … />
b、Java 注解
@Lazy(true)
10、销毁 Bean
a、@PreDestroy 标注方法
b、实现 DisposableBean 接口的 destroy() 方法
c、自定义销毁方法
-
XML 配置:<bean destroy=”destroy” … />
-
Java 注解:@Bean(destroy=”destroy”)
-
Java API:AbstractBeanDefinition#setDestroyMethodName(String)
11 、垃圾回收 Bean
(1)关闭 Spring 容器(应用上下文)
(2)执行 GC
(3)Spring Bean 覆盖的 finalize() 方法被回调