天天看點

Spring注解(生命周期)

Spring注解(生命周期)

對于上面的知識圖解,需要一點一點的研究。

 首先核心容器:

 控制反轉 和 依賴注入

建立工程:

   maven倉庫搜尋 spring context  : 

Spring注解(生命周期)

 引入後

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.3.1.RELEASE</version>

</dependency>

Spring注解(生命周期)

以前是通過 application.xml 進行配置設定

配置類 等同于以前的配置檔案:

Spring注解(生命周期)

config:

測試類:

在xml配置的時候,我們使用的是包掃描的方式

 <context: component-scan base-package= "com.toov5"> </context: conponent-scan>

 包掃描: 隻要标注了 @Controller @Service @Repository  @Component

用注解搞定:  @ComponentScan(value="com.toov5.bean")

可以指定要掃描的包 

排除的包,包括可以按照 名字 按照類型等去排除   excludeFilters    

指定的包,指定掃描的時候隻需要包含哪些元件     includeFilters

還可以通過自定義規則 CUSTOM 通過 implements TypeFilter 重寫match方法

   metadataReader : 讀取到的目前正在掃描的類的資訊

   metadataReaderFactory: 可以擷取到其他任何類

 controller

Service

Dao

測試:

Spring注解(生命周期)

 config類:

自定義的:

 運作結果:

Spring注解(生命周期)

可以繼續往下玩兒:

Spring注解(生命周期)

@Scope 設定作用域 

    config:

  Test:

Spring注解(生命周期)

prototype: 多執行個體的

singleton: 單執行個體的(預設的)

request: 同一次請求建立一個執行個體

session: 同一個session建立一個執行個體

Spring注解(生命周期)

 單例情況下:

測試類啟動ioc容器:

Spring注解(生命周期)

單例模式,ioc容器啟動後會調用方法建立對象放到IOC容器總  以後每次擷取就是直接從容器中擷取. 類似于從map擷取 map.get()

如果是多例模式:

 ioc容器啟動是不會建立對象的!

隻有調用時候,并且調用一次,擷取一次 調用方法建立對象

 config:

Spring注解(生命周期)

@Lazy

 懶加載: 單執行個體bean,預設在容器啟動的時候建立對象,懶加載容器啟動時候先不建立。第一次在使用擷取Bean時候才建立對象,并且進行初始化。

config:

 第一次擷取時候加載。隻建立一次。

Spring注解(生命周期)

 @Condition 按照條件注冊bean

    也是springboot 底層大量使用的。 按照一定條件進行判斷,滿足條件給容器注冊Bean

 原來情況:

列印:

Spring注解(生命周期)

要求:

如果作業系統是win10 被容器注冊 linux

如果是linux  給容器注冊 馬雲

 代碼:

Spring注解(生命周期)

動态擷取環境變量的值

context的巧用:

條件:

 測試:

Spring注解(生命周期)

可以做更多的判斷,更多的條件

@Condition還可以标注在類上面, 滿足目前條件 這個類 中配置的所有Bean注冊才能生效

Spring注解(生命周期)

給容器中注冊元件:

 1、 包+元件标注-@Controller @Service  @Repository @Component

 如果導入第三方包呢?

 2、 别人寫類: @Bean 導入的第三方包裡面的元件

 3、 @Import   快速給容器中導入一個元件  id預設全類名

       @ImportSelector  傳回需要導入的元件的全類名數組

 4、Spring提供的FactoryBean

檢視Ioc中的bean元件:

 除了ioc自己的,還有那幾個正常的

Spring注解(生命周期)

這麼玩兒:

結果:

Spring注解(生命周期)

 如果導入多個 ,可以用數組形式@Import({A.class, B.class})

 id 預設是全類名

類:

Spring注解(生命周期)

從容器中擷取之:

Spring注解(生命周期)

業務判斷:

配置:

Spring注解(生命周期)

FactoryBean 工廠Bean  差別普通的Bean,導入到容器中,容器會調用無參構造器,然後建立一個對象注冊到的容器中

工廠Bean 是個工廠, 是個接口

Spring注解(生命周期)

容器調用:

Spring注解(生命周期)

傳回對象給容器 

 還有兩個方法:

Spring注解(生命周期)
Spring注解(生命周期)

建立一個 Pen 的工廠Beran

然後将工廠bean 加入到容器

工廠Bean 擷取的是調用getObject建立的對象  

Spring注解(生命周期)

在于其他第三方架構整合時候 FactoryBean用的很多

方法一: Bean生命周期,Bean建立到初始化,到銷毀的過程。由容器管理。

  初始化 和 銷毀的方法可以自定義

xml配置中 通過  init-method  destory-method  配置方法指定

方法二: 注解中:  

   構造(對象建立)

     單例: 在容器啟動的時候建立

     多例:在每次擷取的時候建立

對于生命周期的方法聲明,用注解:

  Bean: @Bean(initMethod="init", destroyMethod="destory") 

 config:

測試方法:

Spring注解(生命周期)

關閉容器:

Spring注解(生命周期)

 在資料源的配置過程中 有很多屬性的配置需要用到 銷毀時候 關閉連接配接等等

  總結:

    初始化, 對象建立完成,并指派,調用初始化方法

    銷毀, 容器關閉時候。 但是如果是多例情況,建立對象是擷取時候才會執行。銷毀時候,是不進行的。容器不管的。

 方法三: Spring 還提供了兩個接口: Bean通過實作InitializingBean (定義初始化邏輯)

                                                                                    DisposableBean (定義銷毀邏輯)

 Bean:

Spring注解(生命周期)

還可以使用: JSP250規範的   @PostConstruct   在bean建立完成 并且屬性指派完成執行初始化 

                                                  @Predestory  當bean從容器中銷毀Bean之前 通知清理工作

test:

Spring注解(生命周期)

 還可以使用interface  BeanPostProcessor: 在bean初始化前後進行一些處理工作

     postProcessBeforeInitialization( )   初始化之前工作

     postProcessAfterInitialization( )      初始化之後工作

    後置處理器:  初始化前後進行處理工作

      每個bean在初始化init之前調用 postProcessBeforeInitialization  

                          初始化init 之後調用 postProcessAfterInitialization 

 對于Bean 的生命周期:

  構造器初始化, 初始化(可以自定義指定),初始化前後可以使用(BeanPostProcessor)進行攔截。 銷毀(自定義執行)

關于BeanPostProcessor 在Spring 底層的使用

BeanValidationPostProcessor

    可以做資料校驗, 當對象建立完 給Bean指派以後。做資料校驗

還有

InitDestoryAnnottionBeanPostProcessor

 AutowiredAnnotationBeanPostProcessor    對象建立完了之後 處理所有 @Autowried标注的屬性

小結: BeanPostProcessor 接口 : bean指派,注入其他元件,@Autowried,生命周期注解,@Async 等等

繼續閱讀