读书人

动态署理实现AOP思想

发布时间: 2012-10-15 09:45:24 作者: rapoo

动态代理实现AOP思想



?用户业务接口:

package biz;public interface UserBiz {public void add();}

?

用户业务接口实现类:

package biz;import annotation.Before;public class UserBizImpl implements UserBiz {@Before(name="记录日志方法")public void log(){System.out.println("UserBizImpl.log()");}public void add(){System.out.println("UserBizImpl.add()");}}

?业务方法执行前注解:

package annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Before {public String name() default "";}

?代理工厂类:

?

package proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import annotation.Before;public class ProxyFactory implements InvocationHandler{private Object target;public Object getProxy(Object target) {this.target = target;Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(), this);return proxy;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Object obj = null;System.out.println("方法前的处理");parseBeforeMethod();try {obj = method.invoke(target, args);System.out.println("方法后的处理");} catch (Exception e) {System.out.println("方法异常处理");e.printStackTrace();}finally{System.out.println("方法的最终处理");}return obj;}private void parseBeforeMethod(){Class<?> clazz = target.getClass();for(Method method : clazz.getDeclaredMethods()){Before before = method.getAnnotation(Before.class);if(before != null){try {method.invoke(target);return;} catch (Exception e) {e.printStackTrace();} }}}}

?

客户端代码:

package client;import proxy.ProxyFactory;import biz.UserBiz;import biz.UserBizImpl;public class Client {public static void main(String[] args) {UserBiz userBiz = (UserBiz) new ProxyFactory().getProxy(new UserBizImpl());userBiz.add();}}

?

读书人网 >软件架构设计

热点推荐