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---------