国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

又一次閑來無聊,使用Java的動(dòng)態(tài)代理機(jī)制來模擬AOP

2019-11-06 08:19:33
字體:
供稿:網(wǎng)友

轉(zhuǎn)載地址:http://kentkwan.iteye.com/blog/739499

面向切面編程(AOP)實(shí)現(xiàn)了從另一個(gè)層面解決了面向?qū)ο笏荒芙鉀Q的對(duì)象間耦合度問題。今天閑來無聊做了個(gè)模擬AOP的小例子,有不完善的地方請(qǐng)指出。

首先我們定義一個(gè)接口和實(shí)現(xiàn)類

package com.gzmu.dynamic.PRoxy.service;import java.io.Serializable;import com.gzmu.dynamic.proxy.po.User;public interface UserService {void saveUser(User user);void updateUser(User user);void deleteUser(User user);    User getUser(Serializable id);}
package com.gzmu.dynamic.proxy.service.impl;import java.io.Serializable;import com.gzmu.dynamic.proxy.po.User;import com.gzmu.dynamic.proxy.service.UserService;public class UserServiceImpl implements UserService {    @Overridepublic void saveUser(User user) {        System.out.println("save user success!");    }    @Overridepublic void deleteUser(User user) {        System.out.println("delete user success!");    }    @Overridepublic User getUser(Serializable id) {        System.out.println("get user success!");return null;    }    @Overridepublic void updateUser(User user) {        System.out.println("update user success!");    }}

然后我們建立一個(gè)對(duì)UserService方法的攔截器。

package com.gzmu.dynamic.proxy.interceptor;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import com.gzmu.dynamic.proxy.service.impl.UserServiceImpl;public class UserServiceInterceptor implements InvocationHandler {private Object targer;private String methodName;private BeforeInterceptor beforeInterceptor;private AfterInterceptor afterInterceptor;public UserServiceInterceptor(Object targer, String methodName) {this.targer = targer;this.methodName = methodName;    }public void setBeforeInterceptor(BeforeInterceptor beforeInterceptor) {if (this.beforeInterceptor == null)this.beforeInterceptor = beforeInterceptor;    }public void setAfterInterceptor(AfterInterceptor afterInterceptor) {if (this.afterInterceptor == null)this.afterInterceptor = afterInterceptor;    }    @Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals(methodName)) {            execute(beforeInterceptor);            Object o = method.invoke(new UserServiceImpl(), args);            execute(afterInterceptor);return o;        }return method.invoke(targer, args);    }private void execute(Interceptor interceptor) {if (interceptor != null)            interceptor.execute();    }}

因?yàn)槲覀兿脒@個(gè)攔截器可以攔截到方法的調(diào)用,并且可以在方法的調(diào)用前后執(zhí)行額外可以指定的操作,所以我們使用三個(gè)接口來實(shí)現(xiàn)這個(gè)功能。

package com.gzmu.dynamic.proxy.interceptor;public interface Interceptor {void execute();}// --------------------------------------------------------------package com.gzmu.dynamic.proxy.interceptor;public interface BeforeInterceptor extends Interceptor  {}// --------------------------------------------------------------package com.gzmu.dynamic.proxy.interceptor;public interface AfterInterceptor extends Interceptor {}

最后組裝我們的攔截器來實(shí)現(xiàn)AOP操作

package com.gzmu.dynamic.proxy.test;import java.lang.reflect.Proxy;import org.junit.Test;import com.gzmu.dynamic.proxy.interceptor.AfterInterceptor;import com.gzmu.dynamic.proxy.interceptor.BeforeInterceptor;import com.gzmu.dynamic.proxy.interceptor.UserServiceInterceptor;import com.gzmu.dynamic.proxy.po.User;import com.gzmu.dynamic.proxy.service.UserService;import com.gzmu.dynamic.proxy.service.impl.UserServiceImpl;public class TestCase {    @Testpublic void test() {        UserServiceInterceptor interceptor = new UserServiceInterceptor(new UserServiceImpl(), "saveUser");        interceptor.setBeforeInterceptor(new BeforeInterceptor() {            @Overridepublic void execute() {                System.out.println("before saveUser...");            }        });        interceptor.setAfterInterceptor(new AfterInterceptor() {            @Overridepublic void execute() {                System.out.println("after saveUser...");            }        });        UserService serivce = (UserService) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[] { UserService.class }, interceptor);        serivce.saveUser(new User());        serivce.updateUser(new User());        serivce.deleteUser(new User());        serivce.getUser(null);    }}

運(yùn)行結(jié)果如下

before saveUser...save user success!after saveUser...update user success!delete user success!get user success!怎么樣,超爽吧,再也不用重復(fù)的編寫同樣的代碼了,而且能然代碼組織得更加有邏輯。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 武平县| 沙河市| 绍兴市| 会宁县| 永寿县| 都昌县| 遂溪县| 玉环县| 晋城| 昭平县| 蒙阴县| 始兴县| 兴安盟| 美姑县| 章丘市| 鲁山县| 樟树市| 淮安市| 当阳市| 奉贤区| 兴和县| 安多县| 龙岩市| 深泽县| 娄底市| 金平| 山东省| 穆棱市| 宁远县| 木里| 太原市| 响水县| 孝义市| 舒兰市| 大同县| 武冈市| 莱州市| 鄂温| 呼和浩特市| 古田县| 樟树市|