項目中都用到了Spring、Mybatis、SpringMVC架構,首先來談一談Spring架構,Spring架構以IOC、AOP作為主要思想。
IOC----控制反轉
IOC的全稱為Inversion of Control 即控制反轉,這是一種思想,而不是隻發具體的技術。傳統方式是通過程式直接new來建立一個對象,而IOC方式是把對象的建立交由容器來管理。傳統方式利用new來建立對象使得類與類之間有嚴重的依賴關系,那通過IOC方 式,我們可以将類之間的耦合關系解開,類與類之間松散耦合。
通俗來說,IOC是利用Spring來控制對象的生命周期和對象之間的關系。在傳統的方式中,在一個對象中,如果要使用另外的對象,那麼就需要new一個另外的對象,用完後再銷毀這個對象。類似于找妹子,我們去找看對眼的妹子,然後找她們要微信,求認識,然後進一步的展開追求。那IOC呢,就相當于一個媒婆,它是你找對象的中間媒介,這個媒婆手頭有很多适齡男女的資料,你可以向她提關于女朋友的要求,她會為你找到一個符合你要求的對象。如果媒婆找的人不合适,我們就抛異常。
具體說來呢,就是所有的類都會在Spring容器中進行登記,告訴Spring容器你是什麼,你需要什麼,然後spring會在系統運作到适當的适合把你需要的東西給你,同時也把你交給需要你的東西。所有類的建立、銷毀都交給spring來控制,即控制對象生命周期的不再是引用它的對象,而是spring。對于具體對象而言,原來是它控制其他對象,現在是所有對象都被spring控制,故叫做控制反轉。
DI 依賴注入
在系統運作中,動态的向某個對象提供它所需要的其他對象,這是通過DI(Dependency Injection)實作的。如之前對象A需要操作資料庫,那麼它就需要一個Connection對象,那現在spring會幫助我們在程式運作時構造一個Connection.spring就是通過反射來實作注入的。
AOP----面向切面程式設計
簡單說來,AOP通過動态代理的方式,不改變源代碼邏輯,在源代碼基礎上進行功能增強。
傳統的面向對象程式設計(OOP)是縱向的程式設計,基于子類繼承父類,建立起一種對象的層次結構,适用于縱向關系,而對于一些像日志、安全性、異常處理等與對象核心功能無關的子產品,OOP則沒有用武之地,例如一個項目已經上線運作,但是想在這個項目代碼中加入日志功能,那停掉伺服器修改代碼是一項得不償失的事情了,這時候就到了AOP發揮功能的時候了。
AOP的幾個核心概念:
1、橫切關注點
對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之為橫切關注點
2、切面(aspect)
類是對物體特征的抽象,切面就是對橫切關注點的抽象
3、連接配接點(joinpoint)
被攔截到的點,因為Spring隻支援方法類型的連接配接點,是以在Spring中連接配接點指的就是被攔截到的方法,實際上連接配接點還可以是字段或者構造器
4、切入點(pointcut)
對連接配接點進行攔截的定義
5、通知(advice)
所謂通知指的就是指攔截到連接配接點之後要執行的代碼,通知分為前置、後置、異常、最終、環繞通知五類
6、目标對象
代理的目标對象
7、織入(weave)
将切面應用到目标對象并導緻代理對象建立的過程
8、引入(introduction)
在不修改代碼的前提下,引入可以在運作期為類動态地添加一些方法或字段

AOP的底層實作是基于動态代理的,動态代理技術分為兩種:
1.JDK的動态代理,這種方式要求有接口
2.CGLIB的動态代理,這種方式沒有接口,采用生成類的子類的方式
使用JDK方式生成動态代理舉例:
在接口UserDao的實作類UserDaoImpl中定義兩個方法save()和update()
現在要在中間模拟記錄日志功能,有接口,用jdk的動态代理方式
建構工具類MyProxyUtils.java,InvocationHandler()為内部類
增強方法
CGLIB動态代理