之所以寫Java雜談就是想通過部落格記錄自己的學習的感悟和自己的理解,今天談談Spring 的 IOC和AOP
Spring是一種輕量級框架,可以說Java EE的春天,是當前主流框架,它可以使現有技術更加易用,推進編碼最佳實踐。
它的設計理念是面向Bean的程式設計。
1、低侵入式設計
2、獨立於各種應用伺服器
3、依賴注入特性將元件關係透明化,降低了耦合度
4、面向切面程式設計特性允許將通用任務集中式處理
5、與第三方框架的良好整合
Ioc:
Ioc(Inversion of Control )又稱控制反轉,它是一種設計思想,使用Ioc就相當於你將設計好的物件交給容器控制,並不是物件導向的在物件內部控制。
控制:
傳統的程式設計都是在內部直接new進行建立,也就是程式自己建立了物件,這裡是程式控制的物件;Ioc是由專門一個容器(Ioc容器)來建立這些物件,這裡是Ioc容器控制物件的建立;
可以理解為Ioc使用了Java的23種設計模式的工廠模式,當然Ioc除了控制物件更主要的控制外部資源的獲取像檔案、常數資料等
反轉:
傳統的程式是我沒自己主動控制去直接獲取依賴物件,這裡的物件是主動接收依賴,這個可以理解為正轉;
Ioc中的反轉就是Ioc容器查詢及注入物件,這裡的物件是被動的接受依賴物件,這就是反轉;
通俗的來講,控制反轉使用後不再自己建立物件
DI:
Dependency Injection就是依賴注入的意思,就是理解為容器將某一個依賴關係(紀錄檔功能、例外處理功能)注入到一個類似於積木的元件裡,這樣容器就可以簡單靈活的拼接組合這些依賴關係,像搭建樂高積木一樣,可以變換成很多功能。
這樣做,我們只需要通過簡單的設定,而無需任何程式碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實現。
瞭解AOP首先我們從一段程式碼入手
程式碼如下(範例):
public class UserServiceImpl implements UserService {
private static final Logger log = Logger.getLogger(UserServiceImpl.class);
public boolean addNewUser(User user) {
log.info(「新增使用者 」 + user.getUsername());//記錄紀錄檔
SqlSession sqlSession = null;
boolean flag = false;
//例外處理
try {
sqlSession = MyBatisUtil.createSqlSession();
if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
flag = true;
sqlSession.commit(); //事務控制
} catch (Exception e) {
log.error("新增使用者 " + user.getUsername() + "失敗", e); //記錄紀錄檔
sqlSession.rollback(); //事務控制
flag = false;
} finally {
MyBatisUtil.closeSqlSession(sqlSession);
}
return flag;
}
}
這裡的業務程式碼如下(範例):
sqlSession = MyBatisUtil.createSqlSession();
if (sqlSession.getMapper(UserMapper.class).add(user) > 0)
flag = true;
大家也發現了我們構建系統的目的是解決業務問題,現在卻要維護多個方面的事情(紀錄檔、事務、例外處理)。有些喧賓奪主的感覺,這時候大家就可以用AOP解決程式碼複用,讓我們專心寫業務。
AOP的原理
將複雜的需求分解出不同方面,將散佈在系統中的公共功能集中解決;
採用代理機制組裝起來執行,在不改變原程式的基礎上對程式碼段進行增強處理,增加新的功能
所謂面向切面程式設計,就是一種通過預編譯和執行期動態代理的方式實現在不修改原始碼的情況下給程式動態新增功能的技術
AOP相關術語
對於Spring這兩個核心概念,我相信每一個學習Spring的人都會有自己的理解。這種概念上的理解沒有絕對的標準答案,仁者見仁智者見智。如果有理解不到位或者理解錯的地方,歡迎廣大園友指正!