關於Spring的筆試題(四)

1. 談談你對Spring事務管理機制的理解

Spring事務的本質其實就是數據庫對事務的支持,使用JDBC的事務管理機制,就是利用java.sql.Connection對象完成對事務的提交,那在沒有Spring幫我們管理事務之前,我們要怎麼做

1. 獲取連接:Connection con = DriverManager.getConnection()

2. 開啓事務:開啓事務:con.setAutoCommit

3. 執行CRUD

4. 提交事務或者回滾

5. 關閉連接

使用了事務管理之後可以不用寫第24兩步,它由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/setterbean屬性中的property。當然,getter看個人需求,如果私有屬性需要對外提供的話,應當予以保留。

@Autowired默認按類型匹配的方式,在容器查找匹配的Bean,當有且僅有一個匹配的Bean時,Spring將其注入@Autowired標註的變量中。

@Autowired註解的意思就是,Spring發現@Autowired註解時,將自動在代碼上下文中找到和其匹配(默認是類型匹配)的Bean,並自動注入到相應的地方去。

有一個細節性的問題是,假如bean裏面有兩個propertyjava裏面又去掉了屬性的getter/setter並使用@Autowired註解標註這兩個屬性那會怎麼樣?答案是Spring會按照xml優先的原則去java中尋找這兩個屬性的getter/setter,導致的結果就是初始化bean報錯。 

2Qualifier(指定注入Bean的名稱)

如果容器中有一個以上匹配的Bean,則可以通過@Qualifier註解限定Bean的名稱

舉個例子:

定義一個Car接口兩個實現類BMWCarBenzCar再寫一個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)指定了nametype則根據指定的nametype去匹配bean,任何一個不匹配都將報錯

@Autowired@Resource兩個註解的區別:
(1)@Autowired默認按照byType方式進行bean匹配,@Resource默認按照byName方式進行bean匹配
(2)@AutowiredSpring的註解,@ResourceJ2EE的註解,這個看一下導入註解的時候這兩個註解的包名就一清二楚了

Spring屬於第三方的,J2EEJava自己的東西,因此,建議使用@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候選者時,被註解爲@PrimaryBean將作爲首選者,否則將拋出異常
@Autowired 默認按類型裝配,如果我們想使用按名稱裝配,可以結合@Qualifier註解一起使用。如下:
@Autowired @Qualifier("personDaoBean") 存在多個實例配合使用
@Resource默認按名稱裝配,當找不到與名稱匹配的bean纔會按類型裝配。
@PostConstruct 初始化註解
@PreDestroy 摧毀註解 默認 單例  啓動就加載
@Async異步方法調用

發佈了38 篇原創文章 · 獲贊 31 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章