AOP實(shí)現(xiàn)起來(lái)代碼相當(dāng)簡(jiǎn)單.主要核心是動(dòng)態(tài)代理和反射.
一.接口類:
1
2
3
|
public interface MethodDao { public void sayHello(); } |
二.接口實(shí)現(xiàn)類:
1
2
3
4
5
6
|
public class MethodImpl implements MethodDao { public void sayHello() { System.out.println("hello world"); } } |
三.編寫動(dòng)態(tài)代理類DynamicProxy,***實(shí)現(xiàn)InvocationHandler接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class DynamicProxy implements InvocationHandler { private Object object; /** * < p >Title: </ p > * < p >Description: </ p > * 接受被代理類 */ public DynamicProxy(Object object) { this.object=object; // TODO Auto-generated constructor stub } /* (non-Javadoc) * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) *實(shí)現(xiàn)invoke方法,在方法執(zhí)行之后添加操作 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub System.out.println("=====方法執(zhí)行前======="); method.invoke(object, args); System.out.println("=====方法執(zhí)行后======="); return null; } } |
四.編寫測(cè)試類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
public class Test { public static void main(String[] args) { MethodDao methodDao=new MethodImpl(); InvocationHandler handler = new DynamicProxy(methodDao); //第一個(gè)參數(shù)是類加載器,與handler相同; //第二個(gè)是參數(shù)對(duì)象實(shí)現(xiàn)的接口,如果沒(méi)有的話需要使用cdlib //第三個(gè)參數(shù)是InvocationHandler. //該類返回的其實(shí)是MethodImpl類 methodDao=(MethodDao) Proxy.newProxyInstance(handler.getClass().getClassLoader(), methodDao.getClass().getInterfaces(), handler); methodDao.sayHello(); } } |
五.查看控制臺(tái)輸出:
=====方法執(zhí)行前=======
hello world
=====方法執(zhí)行后=======
六.總結(jié):
通過(guò)上面的代碼可以總結(jié)出AOP的應(yīng)用場(chǎng)景:
1.事務(wù)管理,(事務(wù)的開(kāi)啟跟提交可以直接交由aop來(lái)處理,程序員可以更加專注于業(yè)務(wù))
2.日志管理(在方法調(diào)用的前后可以打印日志)
3.權(quán)限管理(比如登錄驗(yàn)證.管理員權(quán)限等,在調(diào)用某個(gè)方法時(shí),如果權(quán)限不夠也可以提示).
以上這篇?jiǎng)討B(tài)代理模擬實(shí)現(xiàn)aop的示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/hckblogs/archive/2017/11/06/7790038.html