天天看點

Spring尚矽谷筆記Spring

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