1. 程式人生 > 其它 >WPF實現聚光燈效果

WPF實現聚光燈效果

1、談談你對 Spring 的理解

  Spring 是一個開源框架,為簡化企業級應用開發而生。Spring 是一個 IOC和 AOP 容器框架。

  其中 IOC (Inversion of Control)是控制反轉的意思,這是一種面向物件程式設計的設計思想。在傳統的 java 開發模式中,當需要一個物件時,我們要主動去建立它並進行屬性賦值,然後才能去使用這個物件。

  而在 spring 開發模式中,spring 容器使用了工廠模式為我們建立了所需要的 物件,不需要我們自己建立了,直接呼叫 spring 提供的物件就可以了,這是控制反轉的思想。簡單來理解其實就是把獲取依賴物件的方式,交由 IOC容器來實現,由“主動建立”變為“被動獲取”。

  說到IOC就不得不說DI(Dependency Injection),DI是依賴注入的意思,它是IOC實現的一種方式。Spring 使用 JavaBean物件的 set 方法或者帶引數的構造方法為我們在建立所需物件時將其屬性 自動設定所需要的值的過程,就是依賴注入的思想。

  AOP (Aspect-Oriented Programming),意思是面向切面程式設計,是對傳統 OOP(Object-Oriented Programming, 面向物件程式設計) 的補充。就是把可重用的功能提取出來,然後將這些通用功能在合適的時候織入到應用程式中,比如事務管理許可權控制日誌記錄、效能統計等。AOP 底層是動態代理,如果是介面採用 JDK 動態代理,如果是類 採用 CGLIB 方式實現動態代理。

2、Spring 中常用的設計模式

(1)代理模式——spring 中兩種代理方式,若目標物件實現了若干介面,spring 使用 jdk 的 java.lang.reflect.Proxy 類代理。若目標兌現沒有實現任何介面,spring 使用 CGLIB 庫生成目標類的子類。

(2)單例模式——在 spring 的配置檔案中設定 bean 預設為單例模式。

(3)模板方式模式——用來解決程式碼重複的問題。 比如:RestTemplate、JmsTemplate、JpaTemplate

(4)工廠模式——在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是通過使用同一個介面來 指向新建立的物件。Spring 中使用 beanFactory 來建立物件的例項。

3、介紹一下 Spring bean 的生命週期、注入方式和作用域

生命週期:

  • 呼叫構造器 或者是通過工廠的方式建立 Bean 物件
  • 給 bean 物件的屬性注入值

  • 呼叫初始化方法,進行初始化, 初始化方法是通過 init-method 來指定的.

  • 使用

  • IOC 容器關閉時, 銷燬 Bean 物件.

注入方式:

  1) 通過 setter 方法注入

  2) 通過構造方法注入

作用域:

  

  在預設情況下, Spring 的 ApplicationContext 容器在啟動時,會自動例項化所有 singleton 的 Bean 並快取在容器中 。 雖然啟動時會多花費一些時間,但是有這些好處:
* 對 Bean 提前進行例項化操作會及早發現一些潛在的配置問題。
* Bean 以快取的方式儲存,當執行時呼叫該 Bean 時就無須再次例項化咯,因此提高執行效率 。
  在預設情況下, Spring 容器在啟動時不例項化 prototype 的 bean ,此外, Spring 容器將 prototype 的 bean 交給呼叫者後,就不再負責管理它的生命週期咯。

4、Spring如何管理事務?

  Spring為事務管理提供了一致的程式設計模板,在高層次上建立了統一的事務抽象。也就是說,不管是選擇哪種 ORM 技術( MyBatis、Hibernate、JPA還是Spring JDBC) ,Spring都可以讓使用者以統一的程式設計模型進行事務管理。

Spring支援兩種事務程式設計模型:

  1) 程式設計式事務

   Spring提供了TransactionTemplate模板,利用該模板我們可以通過程式設計的方式實現事務管理,而 無需關注資源獲取、複用、釋放、事務同步及異常處理等操作。相對於宣告式事務來說,這種方式 相對麻煩一些,但是好在更為靈活,我們可以將事務管理的範圍控制的更為精確。(可以在方法內部中使用,可以把方法內部的程式碼 按照邏輯分成單元提交。程式設計式事務可以迅速的處理完成並釋放資源,在同樣的資源下實現了高可用高併發,效率會比宣告式事務快N多倍。

  2) 宣告式事務

  Spring事務管理的亮點在於宣告式事務管理,它允許我們通過宣告的方式,在IoC配置中指定事務的邊界和事務屬性,Spring會自動在指定的事務邊界上應用事務屬性。相對於程式設計式事務來說,這種方式十分的方便,只需要在需要做事務管理的方法上,增加@Transactional註解,以宣告事務特徵即可。(當它標註在類上時,代表這個類所有公共(public)非靜態的方法都將啟用事務功能;當它標註在方法上時,代表這個方法將啟用事務功能。

  在@Transactional註解上,我們可以使用 isolation 屬性宣告事務的隔離級別,使用 propagation 屬性宣告事務的傳播機制。

@Transactional的屬性:

事務失效的場景:

  1)在@Transactional註解的方法中,再呼叫本類中的其他方法method2時,那麼method2方法上的@Transactional註解是不!會!生!效!的!但是加上也並不會報錯;

  2)@Transactional註解的方法必須是公共方法,就是必須是public修飾符!!!

  3)@Transactional註解可以標註在類和方法上,也可以標註在定義的介面和介面方法上。如果我們在介面上標註@Transactional註解,會留下這樣的隱患:因為註解不能被繼承,所以業務介面中標註的@Transactional註解不會被業務實現類繼承。所以可能會出現不啟動事務的情況。所以,Spring建議我們將@Transaction註解在實現類上。(在方法上的@Transactional註解會覆蓋掉類上的@Transactional。)

  4)@Transactional註解保證的是每個方法處在一個事務,如果有try一定在catch中丟擲執行時異常

  預設遇到 throw new RuntimeException("..."); 會回滾;

  需要捕獲的throw new Exception("..."); 則不會回滾;

  

5、Spring的事務傳播方式有哪些?

  當我們呼叫一個業務方法時,它的內部可能會呼叫其他的業務方法,以完成一個完整的業務操作。這種業務方法巢狀呼叫的時候,如果這兩個方法都是要保證事務的,那麼就要通過Spring的事務傳播機制控制當前事務如何傳播到被巢狀呼叫的業務方法中。 Spring在TransactionDefinition介面中規定了7種類型的事務傳播行為,它們規定了事務方法和事務方 法發生巢狀呼叫時如何進行傳播,如下表: