1. 程式人生 > 其它 >面試關於IOC和AOP,你都清楚嗎?

面試關於IOC和AOP,你都清楚嗎?

本文章從以下六個方面闡釋什麼是AOP和IOC?

  • 什麼是IOC?
  • IOC解決了什麼問題?
  • IOC和DI的區別?
  • 什麼是AOP?
  • AOP解決了什麼問題?
  • AOP為什麼叫切面程式設計?
    首先宣告:IOC & AOP 不是 Spring 提出來的,它們在 Spring 之前其實已經存在了,只不過當時更加偏向於理論。Spring 在技術層次將這兩個思想進行了很好的實現。

什麼是IOC?

IoC (Inversion of control )控制反轉/反轉控制。它是一種思想不是一個技術實現。描述的是:Java 開發領域物件的建立以及管理的問題。
例子:現有類 A 依賴於類 B

  • 傳統的開發方式 :往往是在類 A 中手動通過 new 關鍵字來 new 一個 B 的物件出來
  • 使用 IoC 思想的開發方式 :不通過 new 關鍵字來建立物件,而是通過 IoC 容器(Spring 框架) 來幫助我們例項化物件。我們需要哪個物件,直接從 IoC 容器裡面過去即可。

從以上兩種開發方式的對比來看:我們 “喪失了一個權力” (建立、管理物件的權力),從而也得到了一個好處(不用再考慮物件的建立、管理等一系列的事情)

為什麼叫控制反轉?

控制:指的是物件建立(例項化,管理)的權利
反轉:控制權交給了外部環境(spring框架丶IOC容器)

IOC 解決了什麼問題?

IOC 的思想就是兩方之間不互相依賴,由第三方容器來管理相關資源。這樣有什麼好處呢?

  1. 物件之間的耦合度或者說依賴程度降低;
  2. 資源變的容易管理;比如你用 Spring 容器提供的話很容易就可以實現一個單例。

IOC和DI的區別?

IOC(Inverse of Control:控制反轉)是一種設計思想 或者說是某種模式。這個設計思想就是 將原本在程式中手動建立物件的控制權,交由 Spring 框架來管理。 IOC 在其他語言中也有應用,並非 Spring 特有。IOC 容器是 Spring 用來實現 IOC 的載體, IOC 容器實際上就是個 Map(key,value),Map 中存放的是各種物件。

IOC 最常見以及最合理的實現方式叫做依賴注入(Dependency Injection,簡稱 DI)

並且老馬(Martin Fowler)在文章中提到將IOC改名為DI

翻譯:因此,我認為我們需要為該模式取一個更具體的名稱。控制反轉是一個過於籠統的術語,因此人們對它感到困惑。因此,在與不同的IOC倡導者進行了大量討論後,我們最終決定使用名稱依賴注入。
文章原文地址

什麼是AOP?

AOP:(Aspect oriented programming) 面向切面程式設計,底層就是動態代理,AOP 是 OOP(面向物件程式設計)的一種延續
先看一個OOP的例子:
例如:現有三個類,Horse、Pig、Dog,這三個類中都有 eat 和 run 兩個方法。
通過 OOP 思想中的繼承,我們可以提取出一個 Animal 的父類,然後將 eat 和 run 方法放入父類中,Horse、Pig、Dog通過繼承Animal類即可自動獲得 eat() 和 run() 方法。這樣將會少些很多重複的程式碼。

OOP 程式設計思想可以解決大部分的程式碼重複問題。但是有一些問題是處理不了的。比如在父類 Animal 中的多個方法的相同位置出現了重複的程式碼,OOP 就解決不了。

/**
 * 動物父類
 */
public class Animal {

    /** 身高 */
    private String height;

    /** 體重 */
    private double weight;

    public void eat() {
        // 效能監控程式碼
        long start = System.currentTimeMillis();

        // 業務邏輯程式碼
        System.out.println("I can eat...");

        // 效能監控程式碼
        System.out.println("執行時長:" + (System.currentTimeMillis() - start)/1000f + "s");
    }

    public void run() {
        // 效能監控程式碼
        long start = System.currentTimeMillis();

        // 業務邏輯程式碼
        System.out.println("I can run...");

        // 效能監控程式碼
        System.out.println("執行時長:" + (System.currentTimeMillis() - start)/1000f + "s");
    }
}

這部分重複的程式碼,一般統稱為橫切邏輯程式碼.

橫切邏輯程式碼存在的問題:

  • 程式碼重複問題
  • 橫切邏輯程式碼和業務程式碼混雜在一起,程式碼臃腫,不變維護

AOP 就是用來解決這些問題的

AOP 另闢蹊徑,提出橫向抽取機制,將橫切邏輯程式碼和業務邏輯程式碼分離

程式碼拆分比較容易,難的是如何在不改變原有業務邏輯的情況下,悄無聲息的將橫向邏輯程式碼應用到原有的業務邏輯中,達到和原來一樣的效果。

AOP 解決了什麼問題?

通過上面的分析可以發現,AOP 主要用來解決:在不改變原有業務邏輯的情況下,增強橫切邏輯程式碼,根本上解耦合,避免橫切邏輯程式碼重複。

AOP 為什麼叫面向切面程式設計?

:指的是橫切邏輯,原有業務邏輯程式碼不動,只能操作橫切邏輯程式碼,所以面向橫切邏輯
:橫切邏輯程式碼往往要影響的是很多個方法,每個方法如同一個點,多個點構成一個面。這裡有一個面的概念
轉自文章面試被問了幾百遍的 IoC 和 AOP ,還在傻傻搞不清楚?

自此關於AOP和IOC的總結到此結束!