Spring 是一個輕量級的Java 開發框架,簡單來講就是管理 Java Bean
的輕量級容器,解決項目中Bean相互依賴的問題。java
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.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 我的總結:緩存
- AOP 就是將各個業務中,有相同的業務抽取出來共同處理,讓開發人員只需關注實際
業務代碼
,從而達到解耦操做
- AOP 的實現原理就是先建立出
代理類
,而後執行咱們的定義的切面方法,而後執行真正須要調用的目標方法,最後將這個代理類
的結果返回- 執行具體的業務邏輯,能夠斷點查看,整體源碼邏輯不是很複雜。
斷點方法
:在調用目標方法的時候打一個斷點,而後跟進便可注意
springboot默認使用的是cglib代理
代碼,若是須要關閉默認選項,讓spring動態選擇的話,須要在 application.properties 中新增pring.aop.proxy-target-class=false
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.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銷燬以前回調該方法 } }