Spring專題

出處 豈安我的博客

1 Spring 簡介

Spring 是一個輕量級的Java 開發框架,簡單來講就是管理 Java Bean 的輕量級容器,解決項目中Bean相互依賴的問題。java

2 IOC

2.1 初步理解IOCspring

  • Spring主要是管理Bean的超級工廠,IOC簡單說就是就是解決Bean與Bean之間的各類依賴。

2.2 建立Bean的2種方式數據庫

  • 註解: 經過在類上打 @Service @Component ...等幾個註解,可讓當前的Bean加入spring工廠
  • xml配置: 在Spring的配置文件中
<bean id="testService" class="java.service.TestService">
            //這裏能夠初始化各個操做
 </bean>

2.3 Spring 容器編程

  • Beanfactory, Spring容器最基本的接口就是 Beanfactory。 BeanFactory負責配置、建立、管理Bean,它有一個子接口: ApplictionContext。
  • Applicationcontext,大部分時候,都不會使用 Beanfactory實例做爲 Spring容器,而是使用 Applicationcontext實例爲容器,所以也把 Spring容器稱爲 Spring上下文。 Applicationcontext是 Beanfactory接口的子接口它増強了 BeanFactory的功能

3 AOP

3.1 下面是我對關於面向切面編程的一些簡單闡述(不官方)。api

  • 切面( Aspect ): 切面即咱們定義處理公共代碼的切面。
  • 鏈接點( Joinpoint):程序執行過程當中明確的點,如方法的調用,或者異常的拋出。在 Spring AOP中,鏈接點老是方法的調用。
  • 加強處理( Advice):即咱們定義的切入點方法,好比Before、Around...
  • 切入點( Pointcut):即咱們定義的切入條件,好比 @Before("execution(*test(..))")
  • 引入 :將方法或字段添加到被處理的類中。 Spring容許將新的接口引入到任何被處理的對象中例如,你可使用一個引入,使任何對象實現 Ismodified接口,以此來簡化緩存。
  • 目標對象 :被AOP框架進行加強處理的對象,也被稱爲被加強的對象。若是AOP框架採用的是動態AOP實現,那麼該對象就是一個被代理的對象。
  • AOP代理 (原理) :AOP框架建立的對象,簡單地說,代理就是對目標對象的增強。 Spring中的AOP代理能夠是JDK動態代理,也能夠是 cglib代理。前者爲實現接口的目標對象的代理,後者爲不實現接口的目標對象的代理。 關於兩個代理的區別,能夠參考 JDK動態代理和cglib代理的區別
  • 織入( Weaving):將加強處理添加到目標對象中,並建立一個被加強的對象(AOP代理)的過程就是織入。織入有兩種實現方式一編譯時加強(如 Aspectj)和運行時加強(如 SpringAOP)。 Spring和其餘純 Java AOP框架同樣,在運行時完成織入。

3.2 瞭解AOP以前,先了解java的 AspectJ 相關概念,能夠說AOP也是根據AspectJ 開發的 3.3 關於AOP的概述,網上描述太多,筆者就不用重複介紹,這裏引用一篇比較詳細的博客 Spring AOP源碼解析 3.4 我的總結:緩存

  1. AOP 就是將各個業務中,有相同的業務抽取出來共同處理,讓開發人員只需關注實際 業務代碼,從而達到 解耦操做
  2. AOP 的實現原理就是先建立出代理類,而後執行咱們的定義的切面方法,而後執行真正須要調用的目標方法,最後將這個代理類的結果返回
  3. 執行具體的業務邏輯,能夠斷點查看,整體源碼邏輯不是很複雜。 斷點方法 :在調用目標方法的時候打一個斷點,而後跟進便可
  4. 注意 springboot默認使用的是 cglib代理 代碼,若是須要關閉默認選項,讓spring動態選擇的話,須要在 application.properties 中新增 pring.aop.proxy-target-class=false

4 Spring事務

4.1 事務的幾個特性: (ACID)springboot

原子性(Atomicity) 一致性(Consistency) 隔離性(Isolation) 持久性(Durability)併發

4.2 Spring事務 事務主要是用於描述數據庫的訪問,Spring自己是不具有事務功能。可是Spring是經過PlatformTransactionManager接口去管理事務的,具體的共有5個實現類,分別在不一樣的場景下完成具體的功能app

注意 : PlatformTransactionManager 是在 spring-tx包中,spring-tx這個包又被spring-jdbc依賴,可見Spring事務是管理jdbc鏈接。框架

做用 實現類
JDBC DataSourceTransactionManager
JPA JapTransactionManager
Hibernate HibernateTransactionManager
JDO JdoTransactionManager
分佈式事務 JtaTransactionManager

4.3 Spring事務的傳播性

事務傳播性 : 是指在同一個事務操做中,若是該操做調用了其餘方法,怎麼去管理這多個方法的事務。能夠定位到 org.springframework.transaction.TransactionDefinition 類中查看更具體的api註釋

名稱 中文翻譯(非官方,便於記憶) 做用
PROPAGATION_REQUIRED 須要傳播 0 傳播當前事務到被調用方法;若是別調用方方法沒有事務,則新建事務。 默認
PROPAGATION_SUPPORTS 支持傳播 1 若是被調用方有事務,就執行事務;若是被調用方沒有事務,則被調用方不加事務
PROPAGATION_MANDATORY 強制傳播 2 強制被調用方方法新增事務,若是被調用方法不存在事務,則拋異常
PROPAGATION_REQUIRES_NEW 建立新的事務 3 被調用方法 新建事務,若是當前方法存在事務,把當前事務掛起。<br>新建的事務將和被掛起的事務沒有任何關係,是兩個獨立的事務<br>,外層事務失敗回滾以後,不能回滾內層事務執行的結果,內層事務失敗拋出異常,<br>外層事務捕獲,也能夠不處理回滾操做
PROPAGATION_NOT_SUPPORTED 不傳播事務 4 以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER 不能用事務 5 以非事務方式執行,若是當前存在事務,則拋出異常。
PROPAGATION_NESTED 嵌套事務 6 若是被調用方方法存在事務,則運行在一個嵌套於已存在的事務中;<br>若是被調用方法沒有事務,則按第一行默認的方法執行。<br>它使用了一個單獨的事務,這個事務擁有多個能夠回滾的保存點。<br>內部事務的回滾不會對外部事務形成影響。<br>它只對DataSourceTransactionManager事務管理器起效。

4.4 數據庫的隔離級別

隔離級別 髒讀(Dirty Read ) 不可重複讀(NonRepeatable Read) 幻讀(Phantom Read)
未提交讀(Read uncommitted) 可能 可能 可能
已提交讀(Read committed) 不可能 可能 可能
可重複讀(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能

髒讀:一事務對數據進行了增刪改,但未提交,另外一事務能夠讀取到未提交的數據。若是第一個事務這時候回滾了,那麼第二個事務就讀到了髒數據。 不可重複讀:一個事務中發生了兩次讀操做,第一次讀操做和第二次操做之間,另一個事務對數據進行了修改,這時候兩次讀取的數據是不一致的。 幻讀:第一個事務對必定範圍的數據進行批量修改,第二個事務在這個範圍增長一條數據,這時候第一個事務就會丟失對新增數據的修改。

<b>總結</b>

隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。 大多數的數據庫默認隔離級別爲 Read Commited,好比 SqlServer、Oracle 少數數據庫默認隔離級別爲:Repeatable Read 好比: MySQL InnoDB

4.5 Spring的隔離級別

Spring的隔離級別一樣在 TransactionDefinition類中定義的

名稱 效果
ISOLATION_DEFAULT 這是個 PlatfromTransactionManager 默認的隔離級別,使用數據庫默認的事務隔離級別。<br>另外四個與 JDBC 的隔離級別相對應。
ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許另一個事務能夠看到這個事務未提交的數據。<br>這種隔離級別會產生髒讀,不可重複讀和幻像讀。
ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另一個事務讀取。<br>另一個事務不能讀取該事務未提交的數據。
ISOLATION_REPEATABLE_READ 這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現幻像讀。
ISOLATION_SERIALIZABLE 這是花費最高代價可是最可靠的事務隔離級別。事務被處理爲順序執行。

5 Spring其餘功能

5.1 指定Bean的 做用域

@Service
//這裏指定bean 的做用域,默認是 singleton
@Scope("prototype")
public class TestService {
}

5.2 定製生命週期行爲

@Service
public class TestService {
    @PostConstruct
    void init() {
        // 指定該Bean的初始化操做,Spring會在該Bean的的依賴注入完成以後回調本方法, 通常用於初始化功能
    }
    @PreDestroy
    void close() {
        //指定該Bean的銷燬方法,Spring會在該Bean銷燬以前回調該方法
    }
}

6 源碼分析

相關文章
相關標籤/搜索