spring核心技術

一 容器

容器是spring中最核心的部分,他管理着spring中bean的創建、配置和管理。
容器創建完bean後,通過DI依賴注入來實現不同bean之間的關係。

1容器的兩種實現方式:

BeanFactory 最基礎的
ApplicationContext 基於BeanFactory實現,可以實現更多功能

兩者區別:
ApplicationContext 初始化時會實例化所有bean, 只實例化一次,後面調用可以直接引用同一份;
BeanFactory 初始化時不會實例化bean, 只是在第一次使用bean時纔會實例化;
ApplicationContext 啓動時會慢些,但是使用的時候比BeanFactory快,不需要在實例化。

2 ApplicationContext的幾種實現

AnnotationConfigApplicationContext:從一個或多個基於Java的配置類中加載 Spring應用上下文。
AnnotationConfigWebApplicationContext:從一個或多個基於Java的配置類中 加載Spring Web應用上下文。
ClassPathXmlApplicationContext:從類路徑下的一個或多個XML配置文件中加 載上下文定義,把應用上下文的定義文件作爲類資源。
FileSystemXmlapplicationcontext:從文件系統下的一個或多個XML配置文件 中加載上下文定義。
XmlWebApplicationContext:從Web應用下的一個或多個XML配置文件中加載上下 文定義。

常用:

ApplicationContext context = new ClassPathXmlApplicationContext("config.xml"); //從類路徑下找配置文件來加載上下文

ApplicationContext context = new AnnotationConfigApplicationContext(com.*.*.Config.class);//從配置類中加載上下文

二 裝配Bean

有3種裝配bean的方式:
1)隱式的bean發現機制和自動裝配 (優先推薦使用)
2)在Java中進行顯式配置 (第三方類庫加載推薦)
3)在XML中進行顯式配置 (配置較繁瑣,不推薦)

1 自動裝配(優先推薦使用)

分成2個步驟
組件掃描:使用@ComponentScan去掃描basePackage下帶有@Component註解的bean, 對其初始化
自動裝配:含有@Component的類如果想引入其他組件, 可以使用@Autowired 註解進行自動裝配進來

組件掃描如下:
在這裏插入圖片描述

自動裝配如下:
在這裏插入圖片描述

組件掃描後會爲bean分配一個默認的ID,默認使用類名,但是首字母爲小寫,如果想修改ID可以指定@Component註解中ID參數。

2 通過java代碼裝配bean

當想把第三方類庫中的bean注入到應用中,使用組件掃描、自動裝配解決不了, 只能使用javaConfig和xml配置方式來裝配,javaConfig和xml裝配的選擇,優先使用javaConfig, 因爲配置使用的也是java代碼,更加靈活。

申明bean的方式實例化:
使用註解@Bean 加到實例化的方法上,如下:
在這裏插入圖片描述
1)默認bean的id是方法名,如果想自定義id可以修改@Bean中name屬性值
2)需要和@Configuration 註解一起使用,使用@Configuration 方便該類被掃描到,如下圖,該註解實際
上也是@Component 組件,所以可以被@ComponentScan 掃到進行初始化
在這裏插入圖片描述

藉助javaConfig來實現注入:
在這裏插入圖片描述
在CDPlaer中注入SgtPeppers 引入對方實例化的方法,並不會每次都執行sgtPeppers方法,spring會攔截返回實例化的bean給調用處。

另一種javaConfig注入方式:
在這裏插入圖片描述
把需要注入的bean寫到方法參數中,這樣在實例化當前bean的時候, 就會取CompactDisc的實例化bean來作爲參數了,此方式推薦使用

三 高級裝配

1 條件化bean

有些bean需要在特定的條件下才可以創建,例如在profile=dev的時候才允許bean創建,其他profile不允許, 引入@Conditional 註解來實現。

使用時直接在@Bean的位置引入@Conditional 註解屬性中需要實現 Condition接口, 接口的matches返回爲true,則代表條件滿足,則可以創建該bean,否則不允許創建該bean.

在這裏插入圖片描述
在這裏插入圖片描述

MagicExistsCondition實現了Condition接口,檢查是否有magic屬性,存在就允許創建bean
在這裏插入圖片描述

2 自動裝配的歧義性

當一個接口有多個實現類時,使用@Autowired 引入bean時就無法選擇使用具體哪個實現類的bean,執行過程會拋出異常。

有兩種解決方式:

1)使用@Primary 設置一個默認首選的bean (不推薦)

@Primary能夠與@Component組合用在組件掃描的bean上,也可以與@Bean組合用在Java配置的bean聲明中,如下
在這裏插入圖片描述
在這裏插入圖片描述

但是當同一個接口的實現類出現了2個(含)以上的@Primary 註解時,@Autowired 自動裝配的時候又出現歧義了,無法選擇其中的一個,所以此方式很容易出現這種問題, 不推薦使用。

2) 使用@Qualifier限定符來設置需要引入的bean (推薦)

可以@Qualifier和 @Autowired 一起使用,@Qualifier 屬性中填需要引入bean的ID, 下面例子就是引入了Dessert的實現類IceCream.
在這裏插入圖片描述
可以不依賴bean Id的限定符,使用自定義名稱的限定符,如下在聲明@Component 時給bean設置一個cold的限定符
在這裏插入圖片描述
具體使用自定義限定符如下:
在這裏插入圖片描述
說明:
自定義的限定符需要在bean類和需要注入bean的上都加上自定義限定符才能生效

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