
對于上面的知識圖解,需要一點一點的研究。
首先核心容器:
控制反轉 和 依賴注入
建立工程:
maven倉庫搜尋 spring context :
引入後
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.1.RELEASE</version>
</dependency>
以前是通過 application.xml 進行配置設定
配置類 等同于以前的配置檔案:
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
測試:
config類:
自定義的:
運作結果:
可以繼續往下玩兒:
@Scope 設定作用域
config:
Test:
prototype: 多執行個體的
singleton: 單執行個體的(預設的)
request: 同一次請求建立一個執行個體
session: 同一個session建立一個執行個體
單例情況下:
測試類啟動ioc容器:
單例模式,ioc容器啟動後會調用方法建立對象放到IOC容器總 以後每次擷取就是直接從容器中擷取. 類似于從map擷取 map.get()
如果是多例模式:
ioc容器啟動是不會建立對象的!
隻有調用時候,并且調用一次,擷取一次 調用方法建立對象
config:
@Lazy
懶加載: 單執行個體bean,預設在容器啟動的時候建立對象,懶加載容器啟動時候先不建立。第一次在使用擷取Bean時候才建立對象,并且進行初始化。
config:
第一次擷取時候加載。隻建立一次。
@Condition 按照條件注冊bean
也是springboot 底層大量使用的。 按照一定條件進行判斷,滿足條件給容器注冊Bean
原來情況:
列印:
要求:
如果作業系統是win10 被容器注冊 linux
如果是linux 給容器注冊 馬雲
代碼:
動态擷取環境變量的值
context的巧用:
條件:
測試:
可以做更多的判斷,更多的條件
@Condition還可以标注在類上面, 滿足目前條件 這個類 中配置的所有Bean注冊才能生效
給容器中注冊元件:
1、 包+元件标注-@Controller @Service @Repository @Component
如果導入第三方包呢?
2、 别人寫類: @Bean 導入的第三方包裡面的元件
3、 @Import 快速給容器中導入一個元件 id預設全類名
@ImportSelector 傳回需要導入的元件的全類名數組
4、Spring提供的FactoryBean
檢視Ioc中的bean元件:
除了ioc自己的,還有那幾個正常的
這麼玩兒:
結果:
如果導入多個 ,可以用數組形式@Import({A.class, B.class})
id 預設是全類名
類:
從容器中擷取之:
業務判斷:
配置:
FactoryBean 工廠Bean 差別普通的Bean,導入到容器中,容器會調用無參構造器,然後建立一個對象注冊到的容器中
工廠Bean 是個工廠, 是個接口
容器調用:
傳回對象給容器
還有兩個方法:
建立一個 Pen 的工廠Beran
然後将工廠bean 加入到容器
工廠Bean 擷取的是調用getObject建立的對象
在于其他第三方架構整合時候 FactoryBean用的很多
方法一: Bean生命周期,Bean建立到初始化,到銷毀的過程。由容器管理。
初始化 和 銷毀的方法可以自定義
xml配置中 通過 init-method destory-method 配置方法指定
方法二: 注解中:
構造(對象建立)
單例: 在容器啟動的時候建立
多例:在每次擷取的時候建立
對于生命周期的方法聲明,用注解:
Bean: @Bean(initMethod="init", destroyMethod="destory")
config:
測試方法:
關閉容器:
在資料源的配置過程中 有很多屬性的配置需要用到 銷毀時候 關閉連接配接等等
總結:
初始化, 對象建立完成,并指派,調用初始化方法
銷毀, 容器關閉時候。 但是如果是多例情況,建立對象是擷取時候才會執行。銷毀時候,是不進行的。容器不管的。
方法三: Spring 還提供了兩個接口: Bean通過實作InitializingBean (定義初始化邏輯)
DisposableBean (定義銷毀邏輯)
Bean:
還可以使用: JSP250規範的 @PostConstruct 在bean建立完成 并且屬性指派完成執行初始化
@Predestory 當bean從容器中銷毀Bean之前 通知清理工作
test:
還可以使用interface BeanPostProcessor: 在bean初始化前後進行一些處理工作
postProcessBeforeInitialization( ) 初始化之前工作
postProcessAfterInitialization( ) 初始化之後工作
後置處理器: 初始化前後進行處理工作
每個bean在初始化init之前調用 postProcessBeforeInitialization
初始化init 之後調用 postProcessAfterInitialization
對于Bean 的生命周期:
構造器初始化, 初始化(可以自定義指定),初始化前後可以使用(BeanPostProcessor)進行攔截。 銷毀(自定義執行)
關于BeanPostProcessor 在Spring 底層的使用
BeanValidationPostProcessor
可以做資料校驗, 當對象建立完 給Bean指派以後。做資料校驗
還有
InitDestoryAnnottionBeanPostProcessor
AutowiredAnnotationBeanPostProcessor 對象建立完了之後 處理所有 @Autowried标注的屬性
小結: BeanPostProcessor 接口 : bean指派,注入其他元件,@Autowried,生命周期注解,@Async 等等