1. 程式人生 > >筆記——spring基本使用(控制反轉IOC、面向切面程式設計AOP、宣告式事務,事務隔離級別、事務傳播)

筆記——spring基本使用(控制反轉IOC、面向切面程式設計AOP、宣告式事務,事務隔離級別、事務傳播)

spring溫習筆記


Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。
Spring 的控制反轉IOC、面向切面程式設計AOP等特性不多說。
本文核心內容:搭建一個Spring Demo
概要:想要啟動spring這個大工廠,需要通過載入spring的核心配置檔案類建立spring的核心類ApplicationContext,

ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");這樣spring就啟動起來了。通過getBean方法可以手動獲取Ban物件:

ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");

Student s=ac.getBean(Student.class);

這樣可以看出使用spring之前需要先將spring的xml核心配置檔案編輯好,這塊的配置這裡只做簡單的配置使用,不進行深度研究。
 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	   xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-4.1.xsd">
           
           	<!--通過該標籤可以匯入其他的xml檔案  這樣就可以將配置進行分開管理  -->
           <import resource="aop.xml"/>	<!--將aop的配置放到了該xml檔案中  -->
           <import resource="tx.xml"/>	<!--將關於事務的配置放到該xml檔案中  -->
           <!-- 掃描Component元件  -->
           <context:component-scan base-package="com"/>
           <context:component-scan base-package="haha"/>
</beans>


關於控制反轉IOC:將我們平時對物件的建立和管理交給spring這個大工廠,由他在我們需要的時候給我建立並注入給我們,
所以關於IOC的另一個說法就是D依賴注入,我們使用的物件需要依賴spring來注入到程式中,來做到集中管理,降低耦合的作用。
在使用這一特性時要讓spring知道需要管理那些類和注入到哪裡,平時常用註解的方式來配置,註解的方式感覺便捷很多,
在xml中開啟元件掃描spring會自動掃描"com"包下的所有元件(Component、Controller、Service、Repository)
添加了註解的類會被spring管理,在需要使用的地方新增宣告一個該物件的引用,在該屬性上添加註入的註解(@Autowired、@Resource)兩者之間的區別:

Autowired是自動注入,自動從spring的上下文找到合適的bean來注入
Resource用來指定名稱注入
Qualifier和Autowired配合使用,指定bean的名稱
Service,Controller,Repository分別標記類是Service層類,Controller層類,資料儲存層的類,spring掃描註解配置時,會標記這些類要生成bean。
Component是一種泛指,標記類是元件,spring掃描註解配置時,會標記這些類要生成bean。
上面的Autowired和Resource是用來修飾字段,建構函式,或者設定方法,並做注入的。而Service,Controller,Repository,Component則是用來修飾類,標記這些類要生成bean。

import org.springframework.stereotype.Component;
@Component
public class TestComponentScan {


	private String tname="DingZuoHeng";


	public  TestComponentScan(){}
	//private  TestComponentScan(){}
	
	public String getTname() {
		return tname;
	}
	public void setTname(String tname) {
		this.tname = tname;
	}
	
}

該類為需要被spring管理的component元件。

import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class Student {
	@Resource
	TestComponentScan testComponentScan;
	public void haveClass(){
		System.out.println("Student類中的haveClass方法執行。。。"+testComponentScan.getTname());
	}
}



將上述元件注入到Student類中,啟動spring並執行haveClass方法就可以看到控制檯輸出被注入類的資訊。
以上就是spring IOC註解方式的簡單使用。下面為AOP簡單使用:

aop的相關術語:

    1 增強(Before、After、Around等)    要額外新增的功能/ 提取出來的重複功能(體現為一個方法)
    2 切面(Aspect)    組織增強的地方 放到程式碼裡就是個類   
    3 連線點(pointcut)  可以新增增強的地方放 spring裡就是方法 
    4 切入點  被添加了增強的連線點 
    5 織入    新增增強的過程
    6 目標    要新增增強的地方 

springAop的開發步驟 :

    1 導包  spring需要額外的aop支援 aspectJ 
    2 編寫  切面程式碼
    3 編寫  配置檔案 或註解 

匯入依賴後、編寫切面以及增強、其實就是編寫一個類然後在該類裡面編寫方法。
寫好後可以直接在增強上添加註解(例如:@Before("execution(* com.*.Student.have*(..))")),或者在配置檔案中
新增:
 

   <aop:aspectj-autoproxy/>  <-- 開啟註解方式的Aspect  -->
  	<aop:config>
    	<aop:aspect  ref="aspect2" >
    			<aop:before method="testAspectbefore" pointcut="execution(void com.entity.*.*(..))"/>
    			<aop:after method="testAspectafter" pointcut="execution(void com.entity.*.*(..))"/>
    	</aop:aspect>
    </aop:config>  

切入點表示式

 execution ( 表示式 )
 表示式 :通配方法: * 代表所有返回值 類的全名一直到方法名(..) 代表所有引數 
 例:execution (* com.oracle.aop.Student.haveClass(..))
AOP的基本使用就到這裡了。在這裡在提一個必然會使用的spring宣告式事務管理,它是基於AOP技術來實現了。
宣告式事務:基於AOP實現(動態代理方式織入事務、提交/回滾事務),只需要要配置檔案中配置好事務規則(tx及aop配置或使用@Transactional註解),註解方式開發簡潔推薦使用。

   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost/test"/>
        <property name="user" value="root"/>
        <property name="password" value="123456"/>
        <property name="maxPoolSize" value="10"/>
        <property name="initialPoolSize" value="2"/>
    </bean>

在xml中配置一個bean,讓spring的事務平臺管理類加入到容器中,並提供資料來源,這裡以c3p0來演示。因使用註解的便利性
大多數時都是使用@Transactional註解 ,在使用該註解時需要在配置中新增如下:
<tx:annotation-driven transaction-manager="transactionManager"/>       來開啟對事務註解

關於事務的其他需要了解的:

事務隔離級別(與資料庫四個級別一致)

1> TransactionDefinition.ISOLATION_DEFAULT    # 這是預設值,表示使用底層資料庫的預設隔離級別。大部分資料庫通常預設是:READ_COMMITTED讀已提交;
2> TransactionDefinition.ISOLATION_READ_UNCOMMITTED   # 一個事務可以讀取另一個事務修改但還沒有提交的資料。
     存在問題:該級別不能防止髒讀,不可重複讀和幻讀,因此很少使用該隔離級別。比如PostgreSQL實際上並沒有此級別。
3> TransactionDefinition.ISOLATION_READ_COMMITTED     # 一個事務只能讀取另一個事務已經提交的資料。可以防止髒讀,這也是大多數情況下的推薦值。
4> TransactionDefinition.ISOLATION_REPEATABLE_READ    # 一個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。可以防止髒讀和不可重複讀。
5> TransactionDefinition.ISOLATION_SERIALIZABLE    # 所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,可以防止髒讀、不可重複讀以及幻讀。
     但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。


髒讀(Dirty read):髒讀發生在一個事務讀取了被另一個事務改寫但還未提交的資料時。如果這些改變在稍後被回滾,那麼之前的事務讀取的到資料就是無效的。
不可重複讀(Nonrepeatable read):不可重複讀發生在一個事務執行相同的查詢兩次或兩次以上,但每一次的查詢結果不同時。這通常是由於另一個併發的事務在兩次查詢之間更新了資料。
幻讀(Phantom read):幻讀是一個事務讀取幾行記錄後,另一個事務插入了一些記錄,幻讀就發生了。在後來的查詢中第一個事務就會發現有一些原來沒有的額外的記錄。

事務傳播行為(TransactionDefinition)

1> PROPAGATION_MANDATORY # 該方法必須執行在一個事務中。如果當前事務不存在則丟擲異常。
2> PROPAGATION_NESTED    # 如果當前存在一個事務,則該方法執行在一個巢狀的事務中。被巢狀的事務可以從當前事務中單獨的提交和回滾。如果當前不存在事務,則開始一個新的事務。各廠商對這種傳播行為的支援參差不齊,使用時需注意。 
3> PROPAGATION_NEVER     # 當前方法不應該執行在一個事務中。如果當前存在一個事務,則丟擲異常。
4> PROPAGATION_NOT_SUPPORTED    # 當前方法不應該執行在一個事務中。如果一個事務正在執行,它將在該方法的執行期間掛起。
5> PROPAGATION_REQUIRED    # 該方法必須執行在一個事務中。如果一個事務正在執行,該方法將執行在這個事務中。否則,就開始一個新的事務。
6> PROPAGATION_REQUIRES_NEW    # 該方法必須執行在自己的事務中。它將啟動一個新的事務。如果一個現有的事務正在執行,將在這個方法的執行期間掛起。
7> PROPAGATION_SUPPORTS    # 當前方法不需要事務處理環境,但如果一個事務已經在執行的話,這個方法也可以在這個事務裡執行。
 

相關推薦

筆記——spring基本使用控制反轉IOC面向切面程式設計AOP宣告事務事務隔離級別事務傳播

spring溫習筆記 Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。 Spring 的控制反轉IOC、面向切面程式設計AOP等特性不多說。 本文核心內容:搭建一個Spring Dem

Spring學習,依賴注入(DI)控制反轉(IoC)和麵向切面(AOP)

依賴注入(DI)和控制反轉(IoC) 在日常編碼中經常遇到在一個類中呼叫另一個類的多個方法,所以就在一個類中new出需要用到的類,也就是組合模式。比如說A類裡面需要用到很多B類裡面的方法,所以要在A類裡面new一個B。 public class

JavaEE框架——Spring入門基礎控制反轉Ioc切面技術Aop

一.簡介: Spring在英語中含義是春天,對於JavaEE開發者來說,Spring框架出現確實帶來了一股全新的春天的氣息。早在2002年,Rod Johson在其編著的《Expert one to one J2EE design anddevelopment》書中,對J

spring控制反轉(IoC)和麵向切面(AOP)的容器框架

什麼是spring,它能夠做什麼? Spring是一個開源框架,它由Rod Johnson建立。它是為了解決企業應用開發的複雜性而建立的。 Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。 然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性

Spring——控制反轉(IOC)和麵向切面(AOP)

可以將所有的物件建立和依賴關係維護交給Spring管理的AOP程式設計支援 Spring 提供的切面程式設計可以方便的實現對程式進行許可權攔截,執行監控等宣告式事物的支援。 Spring支援Junit4,方便測試。 IOC的底層實現原理 IOC將物件的建立權反轉給Sp

Spring 學習二十五——事務其他屬性(隔離級別回滾只讀和過期

併發事務所導致的問題 •當同一個應用程式或者不同應用程式中的多個事務在同一個資料集上併發執行時, 可能會出現許多意外的問題 •併發事務所導致的問題可以分為下面三種類型: –髒讀: 對於兩個事物 T1, T2, T1  讀取了已經被 T2 更新但 還沒有被提交的欄位. 之後, 若

Spring框架學習筆記2——面向切面程式設計AOP

介紹 概念 面向切面程式設計AOP與面向物件程式設計OOP有所不同,AOP不是對OOP的替換,而是對OOP的一種補充,AOP增強了OOP。 假設我們有幾個業務程式碼,都呼叫了某個方法,按照OOP的思想,我們就會將此方法封裝在一個類中,之後通過物件.方法名呼叫 我們可以看作我們的業務程式碼被其他程式碼入侵或者是

C#掃盲篇依賴倒置•控制反轉•依賴注入•面向介面程式設計--滿腹經綸的說

 掃盲系列的文章收到了廣大粉絲朋友的支援,十分感謝,你們的支援就是我最大動力。 我的掃盲系列還會繼續輸出,本人也是一線碼農,有什麼問題大家可以一起討論。也可以私信或者留言您想要了解的知識點,我們一起進步,共同向著高階進發。 掃盲系列文章都是圍繞著下圖知識點來做的,後續還會出一些從基礎到進階系列的Co

spring面試題面向切面程式設計AOP+MVC

Spring面向切面程式設計(AOP) 1.  解釋AOP 面向切面的程式設計,或AOP, 是一種程式設計技術,允許程式模組化橫向切割關注點,或橫切典型的責任劃分,如日誌和事務管理。   2. Aspect 切面 AOP

Spring學習手札面向切面程式設計AOP

AOP理解   Aspect Oriented Program面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。   但是,這種說法有些片面,因為在軟體工程中,AOP的價值體現的並不是程式碼方面,更多的是為了專案的模組化,而不僅僅是為了減少重複程式碼。   AOP是一種程

資料庫事務中的隔離級別spring Transactional註解

資料庫事務中的隔離級別和鎖 資料庫事務在後端開發中佔非常重要的地位,如何確保資料讀取的正確性、安全性也是我們需要研究的問題。 ACID 首先總結一下資料庫事務正確執行的四個要素(ACID): 原子性(Atomicity):即事務是不可分割的最小工作單元,事務內的操作要麼全做,要麼全

那些年搞不懂的高深術語——依賴倒置•控制反轉•依賴注入•面向介面程式設計

那些年,空氣中彷彿還能聞到漢唐盛世的餘韻,因此你決不允許自己的臉上有油光,時刻保持活力。然而,你一定曾為這些“高深術語”感到過困擾——依賴倒置•控制反轉•依賴注入•面向介面程式設計。也許時至今日,你仍對它們一知半解。不過就在今天,這一切都將徹底改變!我將帶領你以一種全新的

spring管理事務屬性之事務4種隔離級別 理解事務的4種隔離級別

理解事務的4種隔離級別 資料庫事務的隔離級別有4種,由低到高分別為Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事務的併發操作中可能會出現髒讀,不可重複讀,幻讀。下面通過事例一一闡述

Spring核心技術面向切面程式設計AOP

這種在執行時,動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面的程式設計。 個人理解就是動態代理,舉例:web中的攔截器就是個典型動態代理。 面向切面程式設計(AOP是Aspect Oriented Program的首字母縮寫) ,

spring關於面向切面程式設計AOP的操作

首先說明:用一個要在進行增刪改操作的時候進行日誌資訊新增的操作來介紹AOP 1、首先需要在spring配置檔案applicationContext.xml中進行相應的配置 配置<aop:aspectj-autoproxy/>這樣一句話 <?xml version="

Spring框架學習筆記——IoCInversion of Control控制反轉AOPAspect Oriented Programming面向切面程式設計

1、Spring IoC IoC是一個Bean容器,在Spring中,它認為一切Java資源都是Java Bean,容器的目標就是管理這些Bean和它們之間的關係。所以在Spring IoC裡面裝載的各種Bean,也可以理解為Java的各種資源,包括Java Bean的建立、事件、行為和Java

控制反轉IOC的依賴注入方式 【調侃】IOC前世今生 IoC模式 談談對Spring IOC的理解 一個簡單的小程式演示Unity的三種依賴注入方式 小菜學習設計模式控制反轉(Ioc) IoC模式依賴依賴倒置依賴注入、控制反轉) IoC模式

轉自:https://www.cnblogs.com/ysyn/p/5563256.html 引言:    專案中遇到關於IOC的一些內容,因為和正常的邏輯程式碼比較起來,IOC有點反常。因此本文記錄IOC的一些基礎知識,並附有相應的簡單例項,而在實際專案中再複雜的應用也只是在

Spring框架學習筆記1——控制反轉IOC與依賴注入DI

Spring框架的主要作用,就是提供了一個容器,使用該容器就可以建立並管理物件。比如說Dao類等,又或者是具有多依賴關係的類(Student類中包含有Teacher類的成員變數) Spring有兩個核心概念,一個是控制反轉(IOC,全稱為Inverse of Control),另一個則是面向切面程式設計(AO

spring IOC控制反轉及DI依賴註入

version bsp rds 編碼 軟件 martin framework 結果 -i 什麽是ioc(控制反轉)    IOC是一種設計思想,用來降低代碼與程序之間的耦合程度,把兩個直接相關的事物把直接相關的部分交給第三方作為中轉從而降低 了耦合性,方便後期維護。控制反轉

談談對Spring IOC控制反轉的理解

學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴注入)這兩個概念,對於初學Spring的人來說,總覺得IoC 、DI這兩個概念是模糊不清的,是很難理解的,今天和大家分享網上的一些技術大牛們對Spring框架的IOC的理解以及談談我對Spring Ioc的理解。