AOP是被看做Spring框架中的一個重頭戲。所以介紹一下。
學習Spring AOP之前,先來了解一下AOP。
AOP應用到項目中的好處,能夠將與業務邏輯不相關的代碼(如:日志、權限等)分離出來,減小相關業務類負擔,并能讓一些通用需求(如:事務)得到更廣泛的復用。
AOP的實現是利用了java核心的代理機制,分靜態代理與動態代理。
靜態代理要求代理對象與被代理對象都實現同一個接口
?2?public?interface?IBusiness{
?3?????????public?void?doBusiness();
?4?}
?5?//實現:
?6?public?class?BusinessImpl?implements?IBusiness{
?7?????????public?void?doBusiness(){
?8?????????????????System.out.println("業務主體部分");
?9?????????}
10?}
11?//執行器:
12?public?class?BusinessHandler?implements?InvocationHandler{
13?????????private?BusinessImpl?bi=null;
14?????????public?BusinessHandler(BusinessImpl?bi){
15?????????????????this.bi=bi;
16?????????}
17?????????public?Object?invoke(Object?proxy,Method?method,Object[]?args)?throws?Throwable{
18?????????????????System.out.println("事務、日志、權限等操作");
19?????????????????method.invoke(bi,args);
20?????????????????System.out.println("事務、日志、權限等操作");
21?????????}
22?????????}
23?}
24?//應用:
25?public?class?AOPAppDemo{
26?????????public?static?void?main(String[]?args){
27?????????????????BusinessImple?bi=new?BusinessImple();
28?????????????????BusinessHandler?bh=new?BusinessHandler(bi);
29?????????????????IBusiness?proxy=(IBusiness)Proxy.newProxyInstance(bi.getClass().getClassLoader(),bi.getClass().getInterfaces(),bh);
30???????????????????proxy.doBusiness();
31?????????}
32?}
上述代碼就是通過靜態代理實現了AOP,BusinessProxy代理了BusinessImpl的doBusiness方法。但是靜態代理一般不能滿足我們項目開發的需求,如果業務需求很多它得為每一個業務方法一一做代理,動態代理正好解決了這一缺點,接下來我們來說說動態代理吧。
動態代理,需實現一個InvocationHandler的接口,重寫invoke(Object proxy,Method method,Object[] args)方法,代理對象實例由Proxy.newProxyInstance(ClassLoader loader,Class interfaces,InvocationHandler h)方法生成,當代理對象的方法被執行時,通知執行器(InvocationHandler)執行invoke(Object proxy,Method method,Object[] args)方法,invoke方法內調用了method.invoke(Object obj,Object... args)方法,該方法對帶有指定參數的指定對象調用由此 Method 對象表示的基礎方法,應該這時才真正代理執行了業務邏輯(這里我是這樣理解的,不知對不對)。
接下來用代碼說明上述動態代理原理,與靜態代理相比接口與實現保持不變
?2?public?interface ?IBusiness{
?3?????????public?void ?doBusiness();
?4? }
?5?//實現:
?6?public?class?BusinessImpl?implements ?IBusiness{
?7?????????public?void ?doBusiness(){
?8?????????????????System.out.println("業務主體部分" );
?9? ????????}
10? }
11?//代理:
12?public?class?BusinessProxy?implements ?IBusiness{
13?????????private ?BusinessImple?bi;
14?????????public ?BusinessProxy(BusinessImple?bi){
15?????????????????this.bi= bi;
16? ????????}
17?????????public?void ?doBusiness(){
18?????????????????System.out.println("事務、日志、權限等操作" );
19? ????????????????bi.doBusiness();
20?????????????????System.out.println("事務、日志、權限等操作" );
21? ????????}
22? }
23?//應用:
24?public?class ?AOPAppDemo{
25?????????public?static?void ?main(String[]?args){
26?????????????????BusinessImpl?bi=new ?BusinessImple();
27?????????????????BusinessProxy?proxy=new ?BusinessProxy(bi);
28? ????????????????proxy.doBusiness();
29? ????????}
30? }
31?