Spring
網課連結 https://www.bilibili.com/video/BV1Vf4y127N5
代碼位址 https://gitee.com/userwhz/spring-ssg
Spring概念
輕量級的JavaEE架構
解決企業應用開發的複雜性
Spring 核心部分
IOC AOP
IOC 控制反轉:把建立對象過程交給Spring進行管理
AOP面向切面:不修改源代碼進行功能的增強
特點
友善解耦,簡化開發
AOP程式設計支援
友善程式測試
友善內建架構
友善進行事務操作
降低API開發難度
入門案例
spring5相關jar包
Beans Core Context Expression
IOC容器
spring基本搭建相關連結 https://www.cnblogs.com/chenyanbin/p/13302036.html
控制反轉:把對象建立和對象之間的調用過程,交給Spring進行管理
目的:降低代碼耦合度
常見方式依賴注入
IOC底層原理
xml解析 工廠模式 反射
IOC過程
1)xml配置檔案
2)service dao 建立工廠類
String classValue = class 屬性值 在工廠中用xml解析 得到類名
CLass clazz = Class.forName(classValue) 反射建立對象 得到class
return (UserDao) clazz.newInstance() 建立對象
IOC思想基于IOC容器完成,底層就是對象工廠
Spring提供IOC容器實作兩種方式(兩個接口)
1)BeanFactory(内部使用接口,一般不适用)
IOC容器基本實作
加載配置檔案時不會建立對象,使用時才建立對象
2)ApplicationContext(一般使用這個)
BeanFactory的子接口
加載配置檔案時會建立對象
主要實作類 (路徑差别)
FileSystemXmlApplicationCOntext
ClassPathXmlApplicationContext
IOC操作Bean管理
兩個操作
- pring建立對象
xml配置
- Spring注入屬性
兩種方式
1)基于xml配置檔案
建立對象
<bean id="user" class="com.atguigu.spring5.User"></bean>
使用bean标簽,标簽裡面添加對應屬性,可以實作對象建立
id 唯一辨別
class 類的全路徑
name 和id類似 可以加特殊符合 一般用id
預設執行無參數構造方法
注入屬性
DI 依賴注入 就是注入屬性
- set方法注入
建立屬性和屬性的set方法
在spring配置檔案中配置對象建立。配置屬性注入
使用property完成屬性注入
- 有參構造注入
建立屬性和有參構造
在spring配置檔案中配置對象建立。配置屬性注入
使用constructor-arg完成屬性注入
- p名稱空間注入,簡化基于xml配置方式(了解)
添加xmlns:p="http://www.springframework.org/schema/p"
在配置檔案中
進行屬性注入
```
<bean id="user" class="com.atguigu.spring5.User" p:userName="aaa">
</bean>
```
注入其他類型屬性
字面量 value
- 空值
```
<property name="username">
<null/>
</property>
```
- 屬性值包含特殊符号
轉義符号
寫到CDATA <[CDATA[内容]]>
注入屬性之外部bean
用service調用dao裡面的方法
在sping的配置檔案中配置
注入屬性之内部bean
一對多 一個部門 多個員工
配置檔案
```
<!--内部bean-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<property name="ename" value=""></property>
<property name="gender" value=""></property>
<property name="dept">
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
<property name="dname" value="保安部"></property>
</bean>
</property>
</bean>
```
注入屬性之級聯指派
```
<!--級聯指派-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
<property name="ename" value=""></property>
<property name="gender" value=""></property>
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
<property name="dname" value="保安部"></property>
</bean>
```
注入屬性之集合屬性
注入數組類型屬性
list
array
注入List集合類型屬性
list
注入Map集合類型屬性
map
entry
注入Set集合類型屬性
set
在集合設定對象類型值
list中加bean
提取集合類型屬性注入
添加
xmlns:util="http://www.springframework.org/schema/util
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-beans.xsd
util
後面bean property 寫上 ref
FactoryBean
兩種bean
普通bean
配置檔案class是什麼傳回什麼
工廠bean
可以傳回不同的類型
建立類 作為工廠bean
實作接口FactoryBean
實作接口的方法,在實作的方法中定義傳回的bean類型
Bean的作用域
設定bean執行個體是單執行個體還是多執行個體
預設單例
scope屬性
預設 singleton 單執行個體 加載spring的配置檔案時就會建立執行個體對象
prototype 多執行個體 在調用對象的時候才會建立對象
bean的生命周期
基本
1. 執行個體化 Instantiation
2. 屬性指派 Populate
3. 初始化 Initialization
4. 銷毀 Destruction
1)通過構造器建立bean執行個體(執行無參數構造)
2)為bean的屬性和引用設定值(調用set方法)
3)調用bean的初始化方法(需要配置,方法需要自己建立)bean标簽屬性 init-method 方法名
4)bean可以使用(對象擷取到了)
5)當容器關閉時,調用bean的銷毀方法(需要配置,方法需要自己建立)bean标簽屬性 destory-method 方法名
bean的後置處理器(建立方法 繼承BeanPostProcessor) before after
1)通過構造器建立bean執行個體(執行無參數構造)
2)為bean的屬性和引用設定值(調用set方法)
把bean的執行個體傳遞給後置處理器的方法
3)調用bean的初始化方法(需要配置,方法需要自己建立)bean标簽屬性 init-method 方法名
把bean的執行個體傳遞給後置處理器的方法
4)bean可以使用(對象擷取到了)
5)當容器關閉時,調用bean的銷毀方法(需要配置,方法需要自己建立)bean标簽屬性 destory-method 方法名
xml自動裝配
手動裝配 自己設定值
自動裝配 bean autowire屬性
byName 根據屬性名稱注入
byType 根據屬性類型注入
引入外部屬性檔案
直接配置資料庫資訊
連接配接池
把外部properties屬性檔案引入spring配置檔案中
引入context名稱空間
和util一樣
引入外部檔案
context:property-placeholder location="位址"
${}
2)基于注解方式
@注解名稱(屬性名稱=屬性值,屬性名稱=屬性值)
作用在類,方法,屬性
目的簡化開發
Bean管理-建立對象
@Component
@Service
@Controller
@Repository
元件掃描配置
引入依賴
開啟元件掃描
名稱空間context
context:component-scan base-package=""
自己配置掃描 filter
屬性注入
@Autowired 根據屬性類型自動裝配
@Qualifier 根據屬性名稱進行注入 指定 (value)
@Resource 可以根據類型注入,也可以根據名稱注入 (name)
@Value 注入普通類型屬性 (value)
不需要加set方法
完全注解開發
元件掃描不在xml配置
建立配置類
@Configuration
@ComponentScan(basePackages = {""} )
AOP操作
基本概念
面向切面程式設計
對業務邏輯的各個部分進行隔離
使得業務邏輯各部分之間的耦合度降低,提高程式的可用性
不通過修改源代碼的方式添加新的功能
底層原理
動态代理
1)有接口情況 使用JDK動态代理
建立實作類代理對象
2)沒有接口情況 使用CGLIB動态代理
建立目前類子類的代理對象
Proxy.newProxyInstance方法 可以傳回指定接口的代理對象
三個參數
類加載器 classLoader
增強方法所在的類,這個類實作的接口,支援多個接口
實作接口InvocationHandler,建立代理對象,寫增強的方法
操作術語
1)連接配接點
可以被增強的方法
2)切入點
實際被真正增強的方法
3)通知(增強)實際增強的邏輯部分
前置通知 Before
後置通知 AfterReturning
環繞通知 Around
異常通知 AfterThrowing
最終通知 After
4)切面
動作
把通知應用到切入點過程
AOP操作
AspectJ 不是Spring組成部分
是獨立的AOP架構
一般和Spring一起使用
實作
基于配置檔案
基于注解 常用
引入依賴
切入點表達式
execution([權限修飾符] [傳回類型] [類全路徑] [方法名稱] ([參數清單]))
舉例
execution(* com.atguigu.dao.BookDao.add(..))
在增強類加@Aspect
方法上加@Before(value = “execution(表達式)”)
無異常順序
環繞前
before
方法
環繞後
after
afterReturning 方法傳回值後執行
有異常設定
環繞前
before
方法 不執行
環繞後 不執行
after
afterReturning 方法傳回值後執行 不執行
配置檔案
命名空間 context
開啟注解掃描
開啟Aspect
aop:asoect-autoproxy
公共切入點抽取
方法上@Poingtcut(value = “execution()”)
方法名
後面value = 方法名
設定增強優先級
@Order(數值) 越小優先值越高
事務操作
資料庫操作基本單元,邏輯上一組操作,要麼都成功,要麼都失敗。
四大特性 ACID
原子性 不可分割
一緻性 操作前後總量不變
隔離性 多事務操作不影響
持久性
Java三層 Web Service業務操作 Dao資料庫操作
開啟事務
執行操作
出現異常,事務復原
送出事務
事務管理
兩種方式
1)程式設計式事務管理
2)聲明式事務管理 一般使用這個
基于xml
底層使用AOP
基于注解 一般用這個
在spring配置檔案中配置事務管理器
配置開啟事務注解 tx名稱空間
annotation-driven
注解
@Transactional
Spring事務管理API
PlatFormTransactionManager
聲明式事務管理參數配置
propagation 事務傳播行為
事務傳播行為用來描述由某一個事務傳播行為修飾的方法被嵌套進另一個方法的時事務如何傳播
事務傳播行為類型說明
PROPAGATION_REQUIRED
如果目前沒有事務,就建立一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
PROPAGATION_SUPPORTS
支援目前事務,如果目前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY
使用目前的事務,如果目前沒有事務,就抛出異常。
PROPAGATION_REQUIRES_NEW
建立事務,如果目前存在事務,把目前事務挂起。
PROPAGATION_NOT_SUPPORTED
以非事務方式執行操作,如果目前存在事務,就把目前事務挂起。
PROPAGATION_NEVER
以非事務方式執行,如果目前存在事務,則抛出異常。
PROPAGATION_NESTED
如果目前存在事務,則在嵌套事務内執行。如果目前沒有事務,則執行與PROPAGATION_REQUIRED類似的操作。
isolation 事務的隔離級别
READ UNCOMMITTED 讀未送出 髒讀 不可重複讀 幻讀
READ COMMITTED 讀已送出 不可重複讀 幻讀
REPEATABLE READ 可重複讀 幻讀
SERIALIZABLE 串行化
解決隔離性
三個讀問題
髒讀 一個未送出的事務讀取到另一個未送出事務的資料
不可重複讀 一個未送出的事務讀取到已送出事務的資料
幻讀 一個未送出的事務讀取到已送出事務添加的資料
timeout 逾時時間 事務在一定時間進行送出,如果不送出進行復原 機關s
readOnly 是否隻讀 預設false
rollbackFor 復原 設定哪些異常進行復原
no RollbackFor 不復原 設定哪些異常不進行復原
完全注解聲明式事務控制
配置類
@EnableTransactionManagement