文章目錄
- 前言
- Spring 體系結構
- IOC&DI
-
- 1.Ioc控制反轉
- 2.DI依賴注入
- 3.目标
- IOC相關之bean
-
- 1.bean的基礎配置
- 2.bean的執行個體化
- 3.bean的生命周期
- 4.IOC管理第三方bean
- DI相關之注入
- 注解開發
-
- 1.介紹
- 2.注解之bean&DI
- 3.注解管理第三方bean
- 4.常見注解的含義
- AOP
-
- 1.介紹
- 2.核心概念
- 3.常見注解
- AOP事務管理
-
- 1.Spring事務
- 2.事務角色
- 3.事務屬性
前言
這篇文章主要是介紹Spring主要的一些理論&基本概念(盡量不貼代碼)
具體實戰操作可以見 Spring(二)實戰
常見面試題可以見Spring(三)面試(其實搞懂這篇文章,三的面試題就不難了,當然也可以用來查漏補缺)
Spring 體系結構
開局一張圖
IOC&DI
Spring最重要的兩大概念之一 —— IOC / DI
1.Ioc控制反轉
(1)為什麼引入Ioc?
之前Web開發中代碼耦合度過高。
業務層需要調用資料層的方法,就需要在業務層new資料層的對象。如果資料層的實作類發生變化,那麼業務層的代碼也需要跟着改變,發生變更後,都需要進行編譯打包和重部署。如下圖:
(2)是以提出解決方案——控制反轉:
IOC:使用對象時,由主動new産生對象轉換為由外部提供對象;此過程中對象建立控制權由程式轉移到外部——此思想稱為控制反轉。
(3)怎麼實作IoC?
- Spring提供了一個容器,稱為IOC容器,用來充當IOC思想中的"外部"
- IOC容器負責對象的建立、初始化等一系列工作,其中包含了資料層和業務層的類對象
- 被建立或被管理的對象在IOC容器中統稱為Bean或Bean對象
2.DI依賴注入
(1)為什麼要依賴注入?
當IOC容器中建立好service和dao對象後,程式能正确執行麼?——不行,因為service運作需要依賴dao對象(是以需要綁定兩者)
(2)解決方案——依賴注入
DI:在容器中建立bean與bean之間的依賴關系的整個過程
3.目标
- 使用IOC容器管理bean(IOC)
- 在IOC容器内将有依賴關系的bean進行關系綁定(DI)
- 最終結果為:使用對象時不僅可以直接從IOC容器中擷取,并且擷取到的bean已經綁定了所有的依賴關系.
IOC相關之bean
(後面都會用注解開發代替,這裡還是采用标簽)
1.bean的基礎配置
通過bean标簽的屬性來進行基礎配置
為什麼bean預設為單例(singleton)?
- bean為單例的意思是在Spring的IOC容器中隻會有該類的一個對象
- bean對象隻有一個就避免了對象的頻繁建立與銷毀,達到了bean對象的複用,性能高
2.bean的執行個體化
對象已經能交給Spring的IOC容器來建立了,但容器如何來建立對象的呢?——bean的執行個體化過程
常見三種方法,主要是構造方法和factorybean
方法 | 描述 |
---|---|
構造方法執行個體化 | |
靜态工廠執行個體化 | |
執行個體工廠執行個體化 |
3.bean的生命周期
bean對象從建立到銷毀的整體過程。
最後以一張圖總結bean相關:
4.IOC管理第三方bean
之前的類都是我們自己建立的,是以可以友善的交給IOC去管理,但是如果要用到第三方類/jar包,該怎麼配置管理?
(标簽配置類的方法略過,直接用下面的注解管理!)
DI相關之注入
(簡單介紹下,後面有注解開發)
(1)setter注入
對于引用資料類型使用的是
<property name="" ref=""/>
對于簡單資料類型使用的是
<property name="" value=""/>
(2)構造器注入
(3)自動裝配
IoC容器根據bean所依賴的資源在容器中自動查找并注入到bean中的過程稱為自動裝配——添加autowire屬性
依賴注入相關:
注解開發
1.介紹
為什麼要用注解開發?——簡化配置開發(之前IOC和DI的實作都需要寫在applicationContext.xml配置檔案的bean标簽中)
怎麼實作注解開發?——删除原來的bean标簽,直接在類上方添加
@Component
注解(注解在哪個類上方這個類就是bean)。如:
@Component("bookDao")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ..." );
}
}
與配置檔案的對應關系是:
純注解開發模式:使用Java類替代配置檔案,即在配置類上添加
@Configuration
注解,将其辨別為一個配置類,替換
applicationContext.xml
。然後在配置類上添加包掃描注解
@Configuration
@ComponentScan("com.itheima")
public class SpringConfig {
}
2.注解之bean&DI
将前面bean和DI通過配置實作的内容都換成對應的注解實作!
(1)bean
@Scope("prototype")
——@Scope設定bean的作用範圍(将某個類變成非單例)
@PostConstruct
——在構造方法之後執行,替換 init-method
@PreDestroy
——在銷毀方法之前執行,替換 destroy-method
(2)DI依賴注入
@Autowired
注解:寫在屬性上并将setter方法删除掉,自動裝配
@Qualifier
注解:指定注入哪個名稱的bean對象,不能獨立使用,和
@Autowired
一起使用
@Value
——從properties配置檔案中讀取内容進行使用
3.注解管理第三方bean
@bean
——将方法的傳回值制作為Spring管理的一個bean對象
@Import
——手動引入需要加載的配置類
4.常見注解的含義
名稱 | 類型 | 位置 | 作用 |
---|---|---|---|
@Component | 類注解 | 類定義上方 | 設定該類為Spring管理的Bean |
@Configuration | 類注解 | 類定義上方 | 設定該類為Spring配置類 |
@ComponentScan | 類注解 | 類定義上方 | 設定spring配置類掃描路徑,用于加載使用注解格式定義的bean |
@Scope | 類注解 | 類定義上方 | 設定該類建立對象的作用範圍 可用于設定建立出的bean是否為單例對象 |
@Autowired | 屬性注解 或 方法注解 | 屬性定義上方 或 标準set方法上方 或 類set方法上方 | 為引用類型屬性設定值 |
@Qualifier | 屬性注解 或 方法注解 | 屬性定義上方 或 标準set方法上方 | 為引用類型屬性指定注入的beanId |
@Value | 屬性注解 或 方法注解 | 屬性定義上方 或 标準set方法上方 | 為 基本資料類型 或 字元串類型 屬性設定值 |
@Bean | 方法注解 | 方法定義上方 | 設定該方法的傳回值作為spring管理的bean |
@Import | 類注解 | 類定義上方 | 導入配置類 |
XML配置與注解對照圖:
AOP
Spring最重要的兩大概念之二 —— AOP
1.介紹
AOP(Aspect Oriented Programming):面向切面程式設計,一種程式設計範式,指導開發者如何組織程式結構。
作用:在不改動原始設計的基礎上為其進行功能增強
2.核心概念
(1)連接配接點((JoinPoint)
程式執行過程中的任意位置,粒度為執行方法、抛出異常、設定變量等,在SpringAOP中,了解為方法的執行
(2)切入點(Pointcut)
比對連接配接點的式子(需要增強的方法)
在SpringAOP中,一個切入點可以描述一個具體方法,也可比對多個方法
(3) 通知(Advice)
在切入點處執行的操作,也就是共性功能(最終以存放共性功能的方法呈現)
(4)通知類
定義通知的類,通知一般是方法,是以需要寫在類中,這個類就是通知類
(5)切面(Aspect)
描述通知與切入點的對應關系
具體可以看下圖:
3.常見注解
名稱 | 類型 | 位置 | 作用 |
---|---|---|---|
@EnableAspectJAutoProxy | 配置類注解 | 配置類定義上方 | 開啟注解格式AOP功能 |
@Aspect | 類注解 | 切面類定義上方 | 設定目前類為AOP切面類 |
@Pointcut | 方法注解 | 切入點方法定義上方 | 設定切入點方法 |
@Before | 方法注解 | 通知方法定義上方 | 設定目前通知方法與切入點之間的綁定關系,目前通知方法在原始切入點方法前運作 |
AOP事務管理
1.Spring事務
事務其實是在Mysql資料庫中最先接觸,事務的作用是:在資料層保障一系列的資料庫操作同成功同失敗
Spring事務作用:在資料層或業務層保障一系列的資料庫操作同成功同失敗
為什麼業務層也需要事務?
- 轉賬業務會有兩次資料層的調用,一次是加錢一次是減錢
- 把事務放在資料層,加錢和減錢就有兩個事務
- 沒辦法保證加錢和減錢同時成功或者同時失敗
- 這個時候就需要将事務放在業務層進行處理
相關注解
名稱 | 類型 | 位置 | 作用 |
---|---|---|---|
@EnableTransactionManagement | 配置類注解 | 配置類定義上方 | 設定目前Spring環境中開啟注解式事務支援 |
@Transactional | 接口注解,類注解,方法注解 | 業務層接口上方,業務層實作類上方,業務方法上方 | 為目前業務層方法添加事務(如果設定在類或接口上方則類或接口中所有方法均添加事務) |
2.事務角色
事務管理者:發起事務方,在Spring中通常指代業務層開啟事務的方法
事務協調員:加入事務方,在Spring中通常指代資料層方法,也可以是業務層方法