spring的aop一部分是用jdk动态代理实现的,jdk动态代理需要被代理的类是接口的实现
首先定义接口
public interface Animals { public void run(); public void stop(); }
然后是实现类
public class Dog implements Animals{ @Override public void run() { System.out.println("the dog is run..."); } @Override public void stop() { System.out.println("the dog is top..."); } }
然后实现handler
public class InvokeHandler implements InvocationHandler{ private Object target; public InvokeHandler(Object target){ this.target=target; } @Override public Object invoke(Object proxyObject, Method method, Object[] args) throws Throwable { System.out.println("begin..................."); Object result=method.invoke(target, args); System.out.println("end......................."); return result; } }
然后测试代理
public class Client { public static void main(String [] sds){ Dog dog=new Dog(); InvokeHandler handler=new InvokeHandler(dog); //生成代理对象 Animals animals=(Animals) Proxy.newProxyInstance(dog.getClass().getClassLoader(),dog.getClass().getInterfaces(), handler); animals.run(); animals.stop(); } }
其实sprng 也是大致这样实现的,spring的容器里面并不是我们原始的bean实例,而是代理后的bean。在我们调用bean的方法的时候,
可以在方法前后做各种操作就是aop了