1. 談談你對Spring事務管理機制的理解
Spring事務的本質其實就是數據庫對事務的支持,使用JDBC的事務管理機制,就是利用java.sql.Connection對象完成對事務的提交,那在沒有Spring幫我們管理事務之前,我們要怎麼做:
1. 獲取連接:Connection con = DriverManager.getConnection()
2. 開啓事務:開啓事務:con.setAutoCommit
3. 執行CRUD
4. 提交事務或者回滾
5. 關閉連接
使用了事務管理之後可以不用寫第2、4兩步,它由Spring自動完成
Spring事務管理的四個優點:
1. 提供一致的對於不同的事務管理的API
2. 支持聲明式事務管理(重點)
3. 編程事務管理(在開發中應用比較少)
4. 優秀的整合與Spring的數據訪問
Spring事務管理主要提供了三個接口來完成
1. org.springframework.transaction.PlatformTransactionManager
這是一個事務管理器,可以來選擇相關的平臺(jdbc hibernate jpa…)
2. TransactionDefinition
它定義事務的一些相關信息 例如 隔離 傳播 超時 只讀
3. TransactionStatus
它主要描述事務具體的運行狀態
2. 解釋一下事物的傳播
spring事務的傳播屬性,就是定義在存在多個事務同時存在的時候,spring應該如何處理這些事務的行爲。這些屬性在TransactionDefinition中定義
REQUIRED ,這個是默認的屬性
Support a current transaction, create a new one if none exists.
如果存在一個事務,則支持當前事務。如果沒有事務則開啓一個新的事務。
被設置成這個級別時,會爲每一個被調用的方法創建一個邏輯事務域。如果前面的方法已經創建了事務,那麼後面的方法支持當前的事務,如果當前沒有事務會重新建立事務。
3. 說一下事物的四種隔離級別的作用
事務的隔離級別也分爲四種,由低到高依次分別爲:read uncommited(讀未提交)、read commited(讀提交)、read repeatable(讀重複)、serializable(序列化),這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。
4. 怎樣開啓註解裝配?
註解裝配默認情況下在Spring容器中是不開啓的。Spring可以使用xml配置文件來裝配bean,也可以使用註解來裝配Bean,開啓註解掃描的方式有兩種,一種是<context:annotation-config/>,另一種是<context:component-scan>;
<context:annotation-config>:註解掃描是針對已經在Spring容器裏註冊過的Bean
<context:component-scan>:不僅具備<context:annotation-config>的所有功能,還可以在指定的package下面掃描對應的bean
5. 講一下你知道的事務管理方式
1. 編碼方案,不建議使用,它具有侵入性。在原有的業務代碼基礎上去添加事務管理代碼
2. 聲明式事務控制,基於AOP對目標進行代理,添加around環繞通知。
這種方案,它不具有侵入性,不需要修改原來的業務代碼
①基於xml配置聲明式事務管理方案
②基於annotation聲明式事務管理方案
Spring常用註解總結:
1、@Autowired
@Autowired,自動裝配,其作用是爲了消除代碼Java代碼裏面的getter/setter與bean屬性中的property。當然,getter看個人需求,如果私有屬性需要對外提供的話,應當予以保留。
@Autowired默認按類型匹配的方式,在容器查找匹配的Bean,當有且僅有一個匹配的Bean時,Spring將其注入@Autowired標註的變量中。
@Autowired註解的意思就是,當Spring發現@Autowired註解時,將自動在代碼上下文中找到和其匹配(默認是類型匹配)的Bean,並自動注入到相應的地方去。
有一個細節性的問題是,假如bean裏面有兩個property,java類裏面又去掉了屬性的getter/setter並使用@Autowired註解標註這兩個屬性那會怎麼樣?答案是Spring會按照xml優先的原則去java類中尋找這兩個屬性的getter/setter,導致的結果就是初始化bean報錯。
2、Qualifier(指定注入Bean的名稱)
如果容器中有一個以上匹配的Bean,則可以通過@Qualifier註解限定Bean的名稱。
舉個例子:
定義一個Car接口,兩個實現類BMWCar和BenzCar,再寫一個CarFactory,引用car(這裏先不用@Qualifier註解),寫一個測試類,運行一下,一定是報錯的,Car接口有兩個實現類,Spring並不知道應當引用哪個實現類。
出現這種情況通常有兩種解決辦法:
(1)、在配置文件中刪除其中一個實現類,Spring會自動去base-package下尋找Car接口的實現類,發現Car接口只有一個實現類,便會直接引用這個實現類。
(2)、實現類就是有多個該怎麼辦?此時可以使用@Qualifier註解來指定Bean的名稱:
3、Resource
@Resource的裝配順序:
(1)@Resource後面沒有任何內容,默認通過name屬性去匹配bean,找不到再按type去匹配
(2)指定了name或者type則根據指定的類型去匹配bean
(3)指定了name和type則根據指定的name和type去匹配bean,任何一個不匹配都將報錯
@Autowired和@Resource兩個註解的區別:
(1)、@Autowired默認按照byType方式進行bean匹配,@Resource默認按照byName方式進行bean匹配
(2)、@Autowired是Spring的註解,@Resource是J2EE的註解,這個看一下導入註解的時候這兩個註解的包名就一清二楚了
Spring屬於第三方的,J2EE是Java自己的東西,因此,建議使用@Resource註解,以減少代碼和Spring之間的耦合。
常用註解:
@Configuration把一個類作爲一個IoC容器,它的某個方法頭上如果註冊了@Bean,就會作爲這個Spring容器中的Bean。
@Scope註解 作用域
@Lazy(true) 表示延遲初始化
@Service用於標註業務層組件、
@Controller用於標註控制層組件(如struts中的action)
@Repository用於標註數據訪問組件,即DAO組件。
@Component泛指組件,當組件不好歸類的時候,我們可以使用這個註解進行標註。
@Scope用於指定scope作用域的(用在類上)
@PostConstruct用於指定初始化方法(用在方法上)
@PreDestory用於指定銷燬方法(用在方法上)
@DependsOn:定義Bean初始化及銷燬時的順序
@Primary:自動裝配時當出現多個Bean候選者時,被註解爲@Primary的Bean將作爲首選者,否則將拋出異常
@Autowired 默認按類型裝配,如果我們想使用按名稱裝配,可以結合@Qualifier註解一起使用。如下:
@Autowired @Qualifier("personDaoBean") 存在多個實例配合使用
@Resource默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配。
@PostConstruct 初始化註解
@PreDestroy 摧毀註解 默認 單例 啓動就加載
@Async異步方法調用