Posted on 2006-12-02 15:52
碼農cz 閱讀(154)
評論(0) 編輯 收藏 所屬分類:
Spring what I know
AOP是被看做Spring框架中的一個重頭戲。所以介紹一下。
學習Spring AOP之前,先來了解一下AOP。
AOP應用到項目中的好處,能夠將與業務邏輯不相關的代碼(如:日志、權限等)分離出來,減小相關業務類負擔,并能讓一些通用需求(如:事務)得到更廣泛的復用。
AOP的實現是利用了java核心的代理機制,分靜態代理與動態代理。
靜態代理要求代理對象與被代理對象都實現同一個接口
?1??//接口:
?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 對象表示的基礎方法,應該這時才真正代理執行了業務邏輯(這里我是這樣理解的,不知對不對)。
接下來用代碼說明上述動態代理原理,與靜態代理相比接口與實現保持不變
?1?//接口:
?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?