IOC:控制反轉。
中文太差,根本看不出來是啥意思。
不過,它有作用,作用:可以實現完全的面向接口編程。
這句話中文倒是看得出來,實現面向接口編程。
但面向接口編程是什麼? 不知道。
接口編程呢。
嗯,大概知道,應該是這樣的吧。
//這是接口
public interface Office{
public void show();
}
// 這是編程 word、pdf、excel 實現接口office的功能
public class Word implements Office{
@Override
public void show() {
System.out.println("I'm word");
}
}
public class Pdf implements Office{
@Override
public void show() {
System.out.println("I'm Pdf");
}
}
public class Excel implements Office{
@Override
public void show() {
System.out.println("I'm Excel");
}
}
所以,這是接口編程吧。
再加上在主函數中使用類的功能。
public static void main(String [] args){
Office t1 = new Word();
t1.show();
Office t2 = new Pdf();
t2.show();
Office t3 = new Excel();
t3.show();
}
}
這樣就完全了,可以分別使用word,pdf,excel的功能了。
但每使用一個功能,就得新建一個對象,功能多了,新建對象就麻煩了。
所以,爲了減少麻煩,理論上就得使用一個對象,然後將這些東西裝載進去。
於是,就建立了一個測試實體類,set用於裝載對象,get用於測試功能。
public class Test {
private Office office = null;
public void setOffice(Office office){
this.office = office;
}
public void getOffice(){
office.show();
}
然後
public static void main(String [] args){
Test t = new Test(new Word());
t.getOffice();
}
這樣就只需要建立一個對象,使用其實現類的功能了。
但是這樣還是有麻煩,如果要改變實現類的功能的話。
Test t = new Test(new Word()); 就要換成 Test t = new Test(newPdf());
雖然看起來挺簡單的,但是在主函數中改變代碼,會有許多的不便。
萬一名字看錯了,怎麼辦? 萬一主程序不能查看,怎麼辦?
於是有沒有一種,不用在主函數中修改代碼,直接改變功能的東西。
所以,IOC就出來了,它在中間加了個配置文件,主函數用的是配置文件裏面的東西,引用的是配置文件的路徑。
主函數 -> 配置文件 ->實現代碼1
主函數(不變) -> 配置文件(改變指向代碼的路徑) ->實現代碼2
只需要修改配置文件裏面的代碼引用路徑就可以修改主函數中的功能實現了。
所以,IOC徹底解決這種代碼之間耦合,它把耦合從代碼中移出去,放在了配置文件中解決。
可以說是,實現了完全的接口編程。
而你只需要對着接口進行修改編程接口的實現類,不用管主程序中的東西,就可以實現各種各樣的功能了。
所以這就是面向接口編程。
所以作用就是:可以實現完全的面向接口編程。
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
AOP:面向切面編程。
百度一下,什麼是面向切面編程。
這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
簡單來說,就是在編程寫完後,對象都建好了,類都寫完了,突然忘記了寫某些東西,但是已經不能再修改類和方法了,不能再添加功能了。這時怎麼辦?只能在運行時,強行將一些代碼加到那些類的方法上面,讓對象強行做某些事情。
當然,如果是在編譯時,你可以修改代碼,修改類型,修改東西。
但是,許多類都有通用的方法,例如,學生、老師、校長都要在中午吃飯,但得有個前提,那就是到了中午的時候。
如果在編譯時,你可以爲學生老師校長都提供一個方法,這個方法就是讓他們在上課時(運行時)看看有沒有到中午,到了中午就執行吃飯的方法。
可是這樣挺麻煩的。編譯人員得寫許多代碼。而且現實中,校長也不滿意(這樣會分散學生的注意力)。
爲什麼不直接建立一個校鈴,到了中午就打鈴,然後他們就吃飯,這樣多簡單啊。
所以這個前提,就是這個切入點。
要執行的方法,就是這個切面。
在業務工作中,一般都是在訪問什麼什麼的時候前加入權限控制,或者在執行什麼什麼方法的時候前加入日誌記錄,這樣的。
比如,某人訪問某網站。打開這個網址,這個就是前提,就是切入點,判斷他有沒有權限進入(遊客或者會員),就是切面。
寫些判斷方法,然後插入到這個切入點,就面向切面編程。
這樣方便控制和管理。
而Spring AOP 底層原理主要是 代理模式機制
JDK動態代理:對實現了接口的類生成代理
CGLib代理機制:對類生成代理
想要弄明白,可以去看動態代理相關的知識。