前言
之所以寫Java雜談就是想通過博客記錄自己的學習的感悟和自己的理解,今天談談Spring 的 IOC和AOP
一、Spring是什么?
Spring是一種輕量級框架,可以說Java EE的春天,是當前主流框架,它可以使現有技術更加易用,推進編碼最佳實踐,
它的設計理念是面向Bean的編程,
二、Spring的優點
1、低侵入式設計
2、獨立于各種應用服務器
3、依賴注入特性將組件關系透明化,降低了耦合度
4、面向切面編程特性允許將通用任務集中式處理
5、與第三方框架的良好整合
三、Spring兩大核心技術
控制反轉(IoC)/依賴注入(DI)
Ioc:
Ioc(Inversion of Control )又稱控制反轉,它是一種設計思想,使用Ioc就相當于你將設計好的物件交給容器控制,并不是面向物件的在物件內部控制,
控制:
傳統的程式設計都是在內部直接new進行創建,也就是程式自己創建了物件,這里是程式控制的物件;Ioc是由專門一個容器(Ioc容器)來創建這些物件,這里是Ioc容器控制物件的創建;
可以理解為Ioc使用了Java的23種設計模式的工廠模式,當然Ioc除了控制物件更主要的控制外部資源的獲取像檔案、常量資料等
反轉:
傳統的程式是我沒自己主動控制去直接獲取依賴物件,這里的物件是主動接收依賴,這個可以理解為正轉;
Ioc中的反轉就是Ioc容器查找及注入物件,這里的物件是被動的接受依賴物件,這就是反轉;
通俗的來講,控制反轉使用后不再自己創建物件
DI:
Dependency Injection就是依賴注入的意思,就是理解為容器將某一個依賴關系(日志功能、例外處理功能)注入到一個類似于積木的組件里,這樣容器就可以簡單靈活的拼接組合這些依賴關系,像搭建樂高積木一樣,可以變換成很多功能,
這樣做,我們只需要通過簡單的配置,而無需任何代碼就可指定目標需要的資源,完成自身的業務邏輯,而不需要關心具體的資源來自何處,由誰實作,
面向切面編程(AOP)
了解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相關術語
- 增強處理(Advice)
- 前置增強
- 后置增強
- 環繞增強、例外拋出增強、最終增強等型別
- 切入點(Pointcut)
- 連接點(Join Point)
- 切面(Aspect)
- 目標物件(Target object)
- AOP代理(AOP proxy)
- 織入(Weaving)
總結
對于Spring這兩個核心概念,我相信每一個學習Spring的人都會有自己的理解,這種概念上的理解沒有絕對的標準答案,仁者見仁智者見智,如果有理解不到位或者理解錯的地方,歡迎廣大園友指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/184850.html
標籤:其他
上一篇:攤牌了,我要手寫一個RPC
