动态代理实现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();}}?