aop 的实现方式有四种。java
1 jdk的动态代理。ide
2 CGLib代理。测试
3 AspectJthis
4 instrumentation代理
下面介绍一下proxy接口
package proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by dingshuangkun on 2018/1/8. */ public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } public <T> T getProxy() { return (T) Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); Object obj = method.invoke(target, args); after(); return obj; } public void before() { System.out.println("------before------"); } public void after() { System.out.println("-------after---------"); } }
实现jdk的动态代理很是简单,实现InvocationHandler接口便可。get
下面作个测试it
package aop; /** * Created by dingshuangkun on 2018/1/8. */ public interface Greeting { void sayHello(String name); void sayNiHao(String name); }
Greeting 实现类io
package aop.impl; import aop.Greeting; /** * Created by dingshuangkun on 2018/1/8. */ public class GreetingImpl implements Greeting { @Override public void sayHello(String name) { System.out.println("hello "+name); } @Override public void sayNiHao(String name) { System.out.println("niHao "+name); } }
单测class
import aop.Greeting; import aop.impl.GreetingImpl; import org.junit.Test; import proxy.DynamicProxy; /** * Created by dingshuangkun on 2018/1/8. */ public class AopTest { @Test public void proxyTest(){ Greeting greeting = new GreetingImpl(); DynamicProxy dynamicProxy = new DynamicProxy(greeting); Greeting greetingProxy = dynamicProxy.getProxy(); greetingProxy.sayHello("ding"); greetingProxy.sayNiHao("ding"); } }
运行结果
------before------ hello ding -------after--------- ------before------ niHao ding -------after---------