天天看點

架構-Spring

  項目中都用到了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)

      在不修改代碼的前提下,引入可以在運作期為類動态地添加一些方法或字段

    

架構-Spring

      AOP的底層實作是基于動态代理的,動态代理技術分為兩種:

       1.JDK的動态代理,這種方式要求有接口

       2.CGLIB的動态代理,這種方式沒有接口,采用生成類的子類的方式

      使用JDK方式生成動态代理舉例:

        在接口UserDao的實作類UserDaoImpl中定義兩個方法save()和update()

        

架構-Spring

       現在要在中間模拟記錄日志功能,有接口,用jdk的動态代理方式

              建構工具類MyProxyUtils.java,InvocationHandler()為内部類

       

架構-Spring

      增強方法

      

架構-Spring

      CGLIB動态代理

架構-Spring