1. 程式人生 > >spring入門——關於aop和ioc(一)

spring入門——關於aop和ioc(一)

Spring的概念

spring是一個開源輕量級框架,通俗的解釋一下,開源:也就是免費;輕量級:不需要依賴很多其他的東西,比如一些容器,可以提高開發除錯的效率。

spring的核心兩部分:

(1)aop:面向切面程式設計

(2)ioc:控制反轉

什麼是AOP?

這裡先解釋一下OOP(Object-Oriented Programing,面向物件程式設計),相信大家對面向物件語言(Object-Oriented Language)不陌生吧,現在我們學的大多數程式設計語言都是面嚮物件語言,比如c++,java等。不管是OOP還是OOL,核心都在於面向物件,面向物件的特點是繼承、封裝和多型。面向物件建立了一種物件層次結構用來模擬公共行為的一個集合,是一種子類繼承父類這樣的從上至下的關係(縱向機制),當需要為分散的物件引入公共行為的時候,OOP將顯得無能為力。

例如日誌功能,日誌往往水平地散佈在所有物件層次中,與功能沒有關係,若是採用OOP設計,將導致大量程式碼重複,不利於各個模組的重用。因此,aop出現了,aop採用橫向抽取機制,在執行時,動態的將程式碼切入到類的指定方法、指定位置上。

這裡引入一張圖來講解。


縱向機制:將寫日誌功能抽取出來單獨封裝到基類(父類)BaseUser中,這樣每次要寫日誌呼叫父類的方法就可以了,這樣避免了每次寫日誌都要寫新增日誌邏輯的程式碼。但是有一個新的問題,如果有10個子類都呼叫了寫日誌方法,而這個時候基類的寫日誌方法要修改,那麼10個呼叫了此方法的子類都要修改,同樣不利於程式碼的維護(耦合高)。

橫向機制:比如說上圖的User類(實現了BaseUser介面,如下圖),若想要增加寫日誌的功能不再呼叫父類的方法,而是使用動態代理方式

建立一個和User平級的介面實現類代理物件(並不是真正的物件)。


AOP操作術語

Joinpoint(連線點): 類裡面可以被增強的方法,這些方法稱為連線點

Pointcut(切入點):所謂切入點是指我們要對哪些Joinpoint進行攔截的定義.
(在類裡面方法可以被增強,而實際操作中被增強的方法稱為切入點)
Advice(通知/增強):所謂通知是指攔截到Joinpoint之後所要做的事情就是通知.通知分為前置通知,後置通知,異常通知,最終通知,環繞通知(切面要完成的功能)
(增強的邏輯,比如新增日誌功能,這個功能就是增強)
Aspect(切面): 是切入點和通知(引介)的結合
(把增強用到切入點的過程就是切面)
Introduction(引介):引介是一種特殊的通知在不修改類程式碼的前提下, Introduction可以在執行期為類動態地新增一些方法或Field.
Target(目標物件):代理的目標物件(要增強的類)
Weaving(織入):是把增強應用到目標的過程.
把advice 應用到 target的過程

Proxy(代理):一個類被AOP織入增強後,就產生一個結果代理類

什麼是IOC?

Ioc—Inversion of Control,即“控制反轉”。用一個例子來解釋,比如一個類A要呼叫類B裡面的非靜態方法,我們傳統的做法是new一個B物件再呼叫方法,形如 B b=new B();這樣導致了類與類之間的高耦合,維護修改程式碼很困難。而控制反轉的核心是:物件的建立不是通過new方法實現,而是交給spring配置建立物件。即IOC容器控制了物件,容器建立及注入依賴物件,物件只是被動的接受依賴物件,所以是反轉

IOC底層原理

相關技術:

1、xml配置檔案

2、dom4j解析xml

3、工廠設計模式

4、反射

一個例子:

比如此時有一個使用者業務UserService類,還有一個Controller:UserServlet,UserServlet中要得到UserService的物件。

第一步:建立xml配置檔案,配置要建立的物件類

<bean id="userService" class="cn.spring.UserService"/>

第二部:建立工廠類,使用dom4j解析配置檔案+反射獲得物件

//工廠類負責生成UserService物件
public static UserService getService(){
    //1、使用dom4j解析xml檔案
    //根據id值得到對應class屬性的值
    String classValue="class屬性值";
    //這裡classValue=cn.spring.UserService
    //2、使用反射建立類物件
    Class clazz=Class.forName(classValue);
    //建立物件
    UserService service=clazz.newInstance();
    return service;
}

然後就可以在UserServlet中呼叫此方法建立物件了

public class UserServlet{
    UserFactory.getService();
}

AOP與IOC詳細的使用將在後文中提到。

原文出自:https://my.csdn.net/qq_37094660(如需轉載請註明出處)