什么是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="" .../>
-
-
-
@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()
方法被回调
-
问题列表
-
Spring如何注册一个Bean
答: 主要用过BeanDefinition
和外部单体对象注册
-
什么是Spring BeanDefinition?