前言
之因此寫Java雜談就是想經過博客記錄本身的學習的感悟和本身的理解,今天談談Spring 的 IOC和AOP
1、Spring是什麼?
Spring是一種輕量級框架,能夠說Java EE的春天,是當前主流框架,它可使現有技術更加易用,推動編碼最佳實踐。
它的設計理念是面向Bean的編程。
sql
2、Spring的優勢
一、低侵入式設計
二、獨立於各類應用服務器
三、依賴注入特性將組件關係透明化,下降了耦合度
四、面向切面編程特性容許將通用任務集中式處理
五、與第三方框架的良好整合
編程
3、Spring兩大核心技術
控制反轉(IoC)/依賴注入(DI)
Ioc:
Ioc(Inversion of Control )又稱控制反轉,它是一種設計思想,使用Ioc就至關於你將設計好的對象交給容器控制,並非面向對象的在對象內部控制。
控制:
傳統的程序設計都是在內部直接new進行建立,也就是程序本身建立了對象,這裏是程序控制的對象;Ioc是由專門一個容器(Ioc容器)來建立這些對象,這裏是Ioc容器控制對象的建立;
能夠理解爲Ioc使用了Java的23種設計模式的工廠模式,固然Ioc除了控制對象更主要的控制外部資源的獲取像文件、常量數據等
反轉:
傳統的程序是我沒本身主動控制去直接獲取依賴對象,這裏的對象是主動接收依賴,這個能夠理解爲正轉;
Ioc中的反轉就是Ioc容器查找及注入對象,這裏的對象是被動的接受依賴對象,這就是反轉;
通俗的來說,控制反轉使用後再也不本身建立對象
DI:
Dependency Injection就是依賴注入的意思,就是理解爲容器將某一個依賴關係(日誌功能、異常處理功能)注入到一個相似於積木的組件裏,這樣容器就能夠簡單靈活的拼接組合這些依賴關係,像搭建樂高積木同樣,能夠變換成不少功能。
這樣作,咱們只須要經過簡單的配置,而無需任何代碼就可指定目標須要的資源,完成自身的業務邏輯,而不須要關心具體的資源來自何處,由誰實現。
設計模式
面向切面編程(AOP)
瞭解AOP首先咱們從一段代碼入手服務器
代碼以下(示例):app
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的原理
將複雜的需求分解出不一樣方面,將散佈在系統中的公共功能集中解決;
採用代理機制組裝起來運行,在不改變原程序的基礎上對代碼段進行加強處理,增長新的功能
編碼
所謂面向切面編程,就是一種經過預編譯和運行期動態代理的方式實如今不修改源代碼的狀況下給程序動態添加功能的技術spa
AOP相關術語設計
- 加強處理(Advice)
- 前置加強
- 後置加強
- 環繞加強、異常拋出加強、最終加強等類型
- 切入點(Pointcut)
- 鏈接點(Join Point)
- 切面(Aspect)
- 目標對象(Target object)
- AOP代理(AOP proxy)
- 織入(Weaving)
總結
對於Spring這兩個核心概念,我相信每個學習Spring的人都會有本身的理解。這種概念上的理解沒有絕對的標準答案,仁者見仁智者見智。若是有理解不到位或者理解錯的地方,歡迎廣大園友指正!