轉(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ù)的編寫同樣的代碼了,而且能然代碼組織得更加有邏輯。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注