1、spring是一個開源的J2EE框架,並且開發快捷,耦合度相對來講比較低,方便後續的修改,並且一直持續更新,和別的一些orm框架以及其餘框架可以很好地結合使用,因此用的比較多。java
2、spring框架有什麼優缺點:mysql
一、spring是一個輕量級的框架,基礎版本很小,只有2M,
web
二、IOC容器通常就是用的WebApplicationContext,控制反轉,我感受就是控制權反過來,調用者再也不去本身建立被調用者的實例對象,而是由spring容器去建立,和IOC一塊兒談的還有DI,也就是依賴注入,我我的感受就是容器建立好實例後,在根據依賴關係將對象實例注入到組件當中。通常注入有三種方式,第一種接口注入,第二種是set方法的注入第三種就是構造器注入。
spring
3:AOP編程,spring的AOP編程就是面向切面,spring將影響到多個類的公共行爲封裝到一個可重用的模塊中,好比日誌這種貫穿整個項目的。用一句大牛說的就是,aop就是將應用程序的商業邏輯和對其提供支持的通用服務分離。一般aop編程用來日誌,權限,緩存,事務中。
sql
4:容器:spring容器能夠幫助管理開發使用中的bean,專業術語叫作IOC控制反轉,傳統開發中對象的生成所有是由開發者完成,在IOC控制反轉中,對象的建立生命週期所有由容器去完成。很久就是減小了依賴性。Bean在容器中的生命週期通常建立,而後填入屬性,事件通知,使用,銷燬。此外bean的做用域,也就是bean的壽命,只須要設置bean的scope屬性就行,四個做用域分別是singleton,prototype,request,session,global-session,其中singleton是spring默認的,整個應用之中只有一個,prototype就是每次每次調用都生成一個新的,bean這個也是簡單解決多線程問題,request就是在每次HTTP請求的時候生成一個bean,session就是每一個session會話有一個bean,global-session每一個portlet上下文session對應一個bean。默認生命週期是singleton。數據庫
5:MVC框架,spring提供了一個設計優良的web MVC框架.
編程
6:事務管理,spring提供了對下至本地業務上至全局業務提供統一的事務管理接口,spring的事務通常採用採用編程式或者聲明式的事務處理,通常編程式的比較靈活,可是須要書寫的代碼比較多,須要在程序中就要手動指定beginTranscation(),commit(),和rollback()等,而聲明式事務是則是在方法前面加上註釋或者在配置文件進行配置,a方法須要事務處理,在spring配置文件中就對其先後進行攔截便可。兩者相對比而言編程式事務能夠由開發人員本身去控制,粒度更細。
緩存
7:spring的事務屬性和傳播級別,spring的Transcation有一個很重要的屬性propagation,主要用來配置當前方法是否與transtation有何聯繫,他的propagation主要有七個取值,安全
spring事務屬性:session
第一個是REQUIRED,這個也是spring默認的事務傳播的默認屬性,他表示若是在有transaction的狀況下執行,若是沒有,則建立新的transaction
第二個是SUPPORTS,表示若是當前有transaction,在transaction狀況下執行,若是沒有,那麼在沒有transaction狀況下執行,
第三個是MANDATORY,英文表示強制的,他表示必須在有transaction的狀況下執行,若是當前沒有transaction,他會直接拋出異常Ille
第四個是REQUIRES_NEW,他表示須要在新的transaction狀況下執行,若是之前有,那麼將會把它掛起
第五個是NOT_SUPPORTED,表示若是當前沒有transaction執行,負責會掛起當前transaction後在執行,
第六個是NEVER,表示必須在沒有transation的狀況下執行,若是有transaction,則會拋出IllegalTransactionStateException異常。
第七個是NESTED,表示若是當前有一個活動的事務,那麼他會嵌套在當前事務中,若是沒有,那麼他的將會屬性值設置爲REQUIRED
事務傳播級別:
第一個是ISOLATION_DEFAULT,這個是PlatfromTransactionManager默認的級別,也是使用數據庫默認的隔離級別,其他四個和數據庫的隔離級別是相對應的
第二個是ISOLATION_READ_UNCOMMITTED,這個是事務隔離的最低級別,他容許其餘事務看到看到這個事務未提交的數據,它對應的數據庫的事務隔離級別就是READ_UNCOMMITED,因爲是讀取其餘事務未提交的數據,也被稱爲髒讀,
第三個是ISOLATION_READ_COMMITED,保證一個事務修改的數據提交後才能被其餘事務看到,另一個事務也不能讀取該事務爲提交的數據,它對應這數據的READ_COMMITED級別,這個是大多數數據庫默認的隔離級別,但不是mysql的默認級別,
第四個是ISOLATION_REPEATABLE_READ,這種級別的事務隔離,能夠防止髒讀,不可重複讀,可是不能阻擋幻想讀,它對應着數據庫的隔離級別是REPEATABLE_ABLE,這個是mysql默認的數據庫隔離級別,他保證了一個事務在多個實例併發讀取數據的時候看到數據是一致的,可是還有一個棘手的問題,就是幻想讀,由於他沒法避免一種狀況,就是在某個事務讀取一個範圍內的數據行的時候,別的事務有可能在這個範圍內插入了新的數據行,這就形成了幻想讀,不過InnoDB和Falcon存儲引擎經過多版本併發機制解決了這個問題,
第五個是ISOLATION_SERIALIZABLE ,花費最高代價最可靠的隔離級別,事務被處理爲順序執行,能夠避免髒讀,不可重複讀和幻想讀,他對應的數據庫的事務隔離級別是Serializable
髒讀:某個事務已經更新了數據,這個時候另外一個事務也在讀取這個數據,因爲某種特殊緣由,前一個事務rollback了,那麼後一個事務讀取的數據就是錯誤的,這就是髒讀
不可 重複讀:再一個事務兩次查詢中數據可能不一致,這就是不可重複讀,可重複讀就是在一個事務兩次條相同的sql查詢中查詢道的結果同樣,
幻想讀:在一個事務兩次查詢中結果不同,好比一個事務查詢幾列數據,此時另外一個事務查無進來數據,那麼接下來的查詢,就會發現幾列數據是先前沒有的,這就是幻想讀。
8:如何向spring容器提供元數據
1:基於xml配置
2:基於註解,
3:基於java的配置
9:spring框架中的單例beans不是線程安全的。
10:spring中bean的生命週期
1:spring讀取xml文件實例化bean
2:spring根據bean的定義設置屬性值
3:若是bean實現了BeanNameAware接口,那麼Spring將bean的id傳遞給setBeanName()方法;
4:若是bean實現了BeanFactoryAware接口,那麼Spring將beanfactory傳遞給setBeanFactory()方法;
5:bean的使用
6:bean的銷燬
11:如何在spring中插入java的集合類
1:list容許插入相同重複的值
2:set不容許插入重複的值
3:map鍵值對的方式,這裏的鍵-值能夠是任何方式
4:props方式也是鍵值對的方式,可是這裏的鍵-值方式都是字符串形式
12:spring bean的自動裝配
1:no默認的是不進行自動裝配,經過手動的ref方式進行手動裝備
2:byName方式,經過參數名進行自動裝配
3:byType方式,經過參數的數據類型進行自動裝配
4:constructor,經過構造函數的參數,
5:autodetecd:若是有構造方法,那麼用構造方法進行裝配,不然採用byType方式進行裝配
13:經常使用的註解
@controller:控制器的註解,中專控制的servlet
@service:業務層對應的bean
@repository:dao層業務所對應的bean
@requestMapping 對應的url
@RequestParam 綁定的參數
@responseBody 表示返回類型將會被用於HTTP相應字節流輸出
.......待續