1. 程式人生 > 其它 >Spring學習(上)

Spring學習(上)

1 概述

1.1 簡介

  1. 整合現有的技術框架;

  2. SSM:SpringMvc + Spring + MyBatis;

  3. IOC與AOP;

1.2 IOC

  1. 概述:控制反轉,程式耦合性降低,可以專注於實現;使用set注入,程式成為被動的接收物件;使用者成為主動方,“自定義程度”增加;

  2. 本質:一種思想;通過依賴注入實現,形象的看,做一個IoC容器,放入東西,使用者取用;

2 第一個程式

key: 程式碼被spring建立和管理;spring的物件稱為Bean;在配置檔案中註冊成功後,對應方法會被spring託管;

2.1 實現

  1. 匯入依賴(包);

  2. 在.xml檔案中建立物件:

    用.xml檔案載入引數,必須寫的:這裡引了上圖的hello物件

    通過ApplicationContext獲取spring容器:

  3. Bean = 物件: 控制反轉的本質即寫好配置檔案後交給“容器”(即Beans or .xml),使用時直接呼叫(從“容器”裡取),不再需要new一個物件出來,spring框架幫我們根據配置檔案建立物件(控制物件改變):

    程式接收物件而不建立(反轉);依賴注入,即用set方法注入(必須有set方法):

  4. ref與value的區別:前者為引用spring容器中建立好的物件,後者是具體值(基本資料型別);

2.2 IoC建立物件方式

  1. 使用無參構造:

    預設方法,即建立一個類的時候,會有預設的無參構造方法,IoC使用這個方法來建立物件;

  2. 使用有參構造:

    若要使無參構造方法失效,需要定義一個有參構造方法,如上圖;具體:

    主要是第三種通過引數名;

  3. 注意點:

    • 每寫一個類就註冊進配置檔案中,進而在程式執行時,spring會把所有註冊進來的類都建立物件(或者叫例項化,執行時等待被呼叫);

    • 對於同一個類,建立幾個不同名的例項,指向的都是同一個類;

  4. 總結:配置檔案載入時,容器(即配置檔案中的Bean)中的物件就已經被初始化了;

3 配置與環境

3.1 Spring配置說明

  1. 別名:放在Beans裡

  2. Bean的配置:(實際上還有很多很多)

   3. import:一般用於團隊,可將多個配置檔案合為一個總的,即不同的類對應不同的.xml檔案,匯入時導總的即可

3.2 DI 依賴注入

key: 三種方式

  1. 構造器注入:如前所示;

  2. Set方式注入:重點

    • 依賴:bean物件的建立依賴於spring容器;

    • 注入:bean物件中的所有屬性都由容器來注入;

    • 具體:

      類中的屬性如下:

      在配置檔案中,對應屬性的set注入方式:

  3. 拓展方式注入

    key: 注意匯入相關的約束.

    • p空間:上面是標頭檔案約束

    • c空間:通過構造器

3.3 Bean作用域

  1. 單例模式:Spring預設機制,所有人共享同一個物件

  2. 原型模式:每次從容器中get的時候,都會產生一個新物件:

  3. 其餘的request、session和application在web開發中使用;

3.4 Bean的自動裝配

key: 自動裝配是spring滿足Bean依賴的一種方式,會在上下文中自動尋找,並裝配屬性.

  1. 三種裝配方式:

    • 在.xml中顯式裝配;

    • 在java中顯式裝配;

    • 隱式的自動裝配

  2. 測試:

    • 環境搭建:

  3. 自動裝配:(會自動在容器上下文中查詢)

    • 自動裝配前:

    • byName自動裝配:對比上上圖看;bean id中的內容和類中set方法中的內容必須一模一樣,否則找不到

    • byType:同上,查詢的 是和自己物件屬性型別相同的bean(id,即類名,甚至可以省略),但是同類型只能有一個bean(全域性唯一,class是關鍵),否則報錯

  4. 小結:

    第二點中,後半句,cat和dog屬於people類,即bean和自動注入的屬性型別一致;

3.5 使用@Autowired實現自動裝配

  1. 匯入約束(上)和配置註解支援(下):

    注意約束名字,可以直接複製替換:

  2. 使用:@Autowired可在屬性上使用,也可以放到set方法上,但是加了註解後,可以不用set方法(前提是加了自動裝配註解的屬性在spring容器|IoC容器|配置檔案中存在,即已經配置好了,且符合byName條件,即通過型別或者屬性名唯一確定):

  3. 註解屬性說明:

    另@Nullable也表示可為空;

  4. 複雜情況:同一類對應多個型別值(屬性值不唯一時),加@Qualifier註解可指定該類對應那個註冊的型別值,而未指定則報錯了(如cat)

  5. 小結

    //這兩個是一對使用
    @Autowired
    @Qualifier(value = "dog222")

3.6 使用@Resource實現自動裝配

  1. 功能:較@Autowired高階,會自動先根據id中的名,再根據型別名來找到配置內容,可以直接賦值;

  2. 可能的錯誤:

    找名字,配置檔案中同一型別(Cat類)下兩個不同的id(cat1和cat2),會失敗;或者名字(@Resource(name = “cat”),這樣沒有類名能對上)對不上會報錯

    下圖指定為cat2,在上圖的情況下就不會裝配錯誤

  3. 小結:@Resource和@Autowired的區別

    • 都用來自動裝配,都可放在屬性欄位上;

    • @Autowired預設通過byType方式實現,且物件必須存在;

    • @Resource預設通過byName方式實現,找不到則自行換為byType實現,否則報錯;

    • 執行順序不同,一個byType,一個byName;