2.BeanDefinition 元信息
BeanDefinition是Spring Framework中定義Bean的配置元信息接口
- Class 全類名,必須是具體類,不能用抽象類或接口
- Name 名稱或者ID
- Scope 作用域
- Constructor arguments 構造器參數,用於依賴注入
- Properties 屬性設置,用於依賴注入
- Autowiring mode 自動綁定模式
- Lazy initialization mode 是否延遲初始化
- Initialization method 初始化回調方法名稱
- Destruction method 銷燬回調方法名稱
BeanDefinition構建
- 通過BeanDifinitionBuilder
- 通過AbstractBeanDefinition以及派生類
BeanDefinition並非bean的終態
3.命名Spring Bean
每個Bean擁有一個或多個標識符,這些標識符在Bean所在的容器必須是唯一的。
如果沒有手動設置,Spring會自動生成一個默認的
BeanDefaultBeanNameGenerator: 默認名稱生成器
4.Spring Bean的別名
Bean的別名可以產生什麼價值:
- 複用現有的BeanDefinition,別名必須有BeanDefinition
- 更具有場景化的命名方法
5.BeanDefinition 註冊
- XML配置元信息
- JAVA註解配置元信息
- @Bean
- @Component
- @Import
如果多個註解同時使用,不會重複註冊
- JAVA API配置元信息(最根本的方式)
- 命名方式 BeanDefinitionRegister
- 非命名方式 BeanDefinitionReaderUtils
- 配置類方式 AnnotatedBeanDefinitionReader
6.實例化Spring Bean
- 常規方式
- 通過構造器(配置元信息:XML JAVA註解 JavaAPI)
- 通過靜態工廠方法(配置元信息:XML JavaAPI)
- 通過Bean工廠方法(配置元信息:XML JavaAPI)
- 通過FactoryBean(配置元信息:XML JAVA註解 JavaAPI)
- 特殊方式
- 通過ServiceLoaderFacotoryBean(配置元信息:XML JAVA註解 JavaAPI)
- 通過AutowireCapableBeanFactory的createBean
- 通過BeanDefinitionRegistry的registerBeanDefinition
7.初始化Spring Bean
-
@PostConstruct 最常規的使用方式
-
實現InitializingBean接口的afterPropertiesSet方法
-
自定義初始化方法
- XML註解
- JAVA註解
- JAVA API AbstractBeanDefinition#setInitMethodName
執行順序優先級從高到低
8.延遲初始化Spring Bean
- XML 配置lazy-init
- java註解 @Lazy(true)
默認是非延遲的
非延遲初始化,在上下文啓動完成後,被初始化
而延遲初始化,是由於依賴查找觸發初始化
9.銷燬Spring Bean
-
@preDestroy
-
實現DisposableBean接口的destory方法
-
自定義銷燬方法
- XML配置 <bean destory = “destory”
- JAVA註解 @Bean(destory=“destory”)
- JAVA API AbstractBeanDefinition#setDestroyMethodName
順序優先級從高到低,應用上下文關閉的時候會銷燬
10.垃圾回收Spring Bean
三要素:
- 關閉spring容器(重點)
- 執行GC(非必須)
- Spring bean覆蓋finalize()方法被回調(非必須)
11.常見問題
⑴如何註冊一個Spring bean
通過BeanDefinition和外部單體對象來註冊
⑵什麼是BeanDefinition
Bean的元信息