【Spring】SpringBean基礎

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的元信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章