前言:本文檔是本人自學Spring時候手動碼的,裏邊參考了各路大神的文章,我做了一個系統的整合。好好學習,共同進步!!
一、Spring介紹
1.Spring的作用
Spring負責項目中的所有對象,可以看做是項目對象的管家。正是因爲Spring框架是屬於容器性質的,容器中裝 什麼對象就有什麼功能,所以可以一站式開發。不僅不排斥其他框架,還能幫助其他框架管理對象。
2.Sping中所用到的思想
Aop:面向切面編程,利用aop可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯之間的耦合度降低,提高程序的可重用性。
Ioc:反轉控制,減低代碼耦合度,最常見的方式叫依賴注入。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。
3.Sping Jdbc
相對於傳統的jdbc實現,在jdbc API的基礎上封裝了一套JdbcTemplate,JdbcTemplate。優點如下:
- 配置基於模板設置
- 完成了資源創建和釋放的工作
- 完成了對jdbc的核心流程的工作,包括sql語句的創建和執行,簡化了jdbc操作
- 僅需要傳遞DataSource就可以把它實例化
- JdbcTemplate只需要創建一次
- JdbcTemplate是線程安全的
例如:
<!-- 創建jdbcTemplate對象 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"> </property>
</bean>
4.Spring aop事務
事務:必須遵循4個原則,ACID
A:Automicity,原子性,強調事務作爲原子級別已經不可以再被分割,要麼成功要麼失敗。
C:Consistency,一致性,狀態轉換必須是由一種正確的狀態轉換到另外一種正確的狀態。
I:IsoIation,隔離性,即相互間必須不能被影響。
D:Durability,持久性,即事務提交後將被永久保存,即便出現其他故障,事務處理結果也應得到保存。
事務的作用:對企業級應用至關重要,保證每一次操作都是可靠的,即使出現異常,也不至於破壞後臺數據的完整性。
併發下事務會產生的問題:
髒讀:事務A讀到了事務B還沒有提交的數據.A和B都取錢,A先開啓事務,此時B也開啓事務取走100快,沒有提交,此時數據庫還沒更新,事務A讀取的肯定是數據庫裏邊的原始數據。這就是髒讀。
不可重複讀:在一個事物裏讀取了兩次某個數據,讀出來的數據不一致。事物A開啓事務,查出銀行卡餘額爲1000快。此時事務B開啓事務,取走100,並提交,裏邊餘額變爲900.此時切回事務A,再查一次查出賬戶餘額爲900。這樣對A而言,在用一個事務內兩次讀取賬戶餘額不一致,就是不可重複讀。
幻讀:在一個事物裏邊的操作發現了未被操作的數據。比如學生信息,事務A開啓事務,修改學生的出勤情況爲false,此時切換到事務B,事務B開啓事務->插入 一條學生數據,此時切換到事務A,發現一條未被自己修改過的數據,這就是幻讀,跟發生了幻覺一樣。
事務的隔離級別,Spring提供了5種:
- DEFAULT 默認隔離級別,每種數據庫支持的事務隔離級別不一樣,如果Spring配置事物時將isolation設置爲DEFAULT的話,將使用數據庫的默認隔離級別。
- READ_UNCOMMITTED讀未提交,即能夠讀取到沒有被提交的數據,所以很明顯這個級別的隔離機制無法解決髒讀、不可重複讀、幻讀中的任何一種,因此很少使用。
- READ_COMMITED 讀已提交,即能夠讀取那些已經提交的數據,能夠防止髒讀,但是無法避免不可重複讀和幻讀。
- REPEATABLE_READ重複讀取,即在數據讀出來之後加鎖,類似"select * from XXX for update"。明確數據讀取出來是爲了更新用的,所以要加一把鎖,防止別人修改。也類似於,讀取了一條數據,這個事物不結束,別的事物就不可以改這條記錄。這樣就解決了髒讀,不可重複讀,但是幻讀還是沒有解決。
- SERLALIZABLE 串行化,事務的最高隔離級別,不管多少事務,挨個運行完所有的子事務之後纔可以執行另外一個事務裏面的所有子事務,這樣就解決了髒讀、不可重複讀、幻讀的問題。
5.Spring junit測試支持
(1)導入spring-test-3.2.0.RELEASE.jar
(2)添加依賴包 項目右鍵單擊BuildPath>AddLibrary>JUnit 選JUnit4 完成.
(3)創建測試類
import org.junit.Test;import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.level.service.TestService;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")//加載spring容器配置文件public class TestJUnit {
@Autowired
private TestService testService;
@Test
public void test(){
testService.save();
}
}