1 public interface Subject { 2 void doSomeThing(); 3 }2.真实业务类实现接口
1 public class RealSubject implements Subject{ 2 @Override 3 public void doSomeThing() { 4 System.out.println("真实业务"); 5 } 6 }3.代理类也实现业务接口,创建真实业务对象,在重写的方法中做方法增强
1 public class proxySubject implements Subject{ 2 Subject proxy = new RealSubject(); 3 @Override 4 public void doSomeThing() { 5 System.out.println("前置增强"); 6 proxy.doSomeThing(); 7 System.out.println("后置增强"); 8 } 9 }4.测试类执行结果
1 public class proxyTest { 2 public static void main(String [] args){ 3 Subject proxy = new proxySubject(); 4 proxy.doSomeThing(); 5 6 }
} 二.JDK动态代理 1.同样是需要接口和实现类 2.JDK动态代理实现方式
1 //JDK动态代理 2 //真实业务对象 3 final Subject subject = new RealSubject(); 4 //动态代理对象 5 Subject proxy = (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(), subject.getClass().getInterfaces(), new InvocationHandler() { 6 @Override 7 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 8 //增强操作 9 System.out.println("前置增强==="); 10 //方法传入真实业务对象 11 Object invoke = method.invoke(subject, args); 12 System.out.println("后置增强==="); 13 return invoke; 14 } 15 }); 16 proxy.doSomeThing(); 17
3.执行结果 三.CGLIB动态代理 1.需要导入依赖
1 <dependency> 2 <groupId>cglib</groupId> 3 <artifactId>cglib</artifactId> 4 <version>2.2</version> 5 </dependency> 6
2.具体实现方式(不需要接口也能实现)
1 //真实业务对象 2 final service ser = new service(); 3 /** 4 * Enhancer是一个非常重要的类,它允许为非接口类型创建一个JAVA代理, 5 * Enhancer动态的创建给定类的子类并且拦截代理类的所有的方法, 6 * 和JDK动态代理不一样的是不管是接口还是类它都能正常工作。 7 * */ 8 Enhancer enhancer = new Enhancer(); 9 //关联真实业务对象 10 enhancer.setSuperclass(ser.getClass()); 11 /** 12 * MethodInterceptor,这是一个功能很强大的接口,它可以实现类似于AOP编程中的环绕增强(around-advice)。 13 * 它只有一个方法public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable;。 14 * 代理类的所有方法调用都会转而执行这个接口中的intercept方法而不是原方法。 15 * */ 16 enhancer.setCallback(new MethodInterceptor() { 17 @Override 18 public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 19 System.out.println("***前置增强***"); 20 Object invoke = methodProxy.invoke(ser, objects); 21 System.out.println("***后置增强***"); 22 return invoke; 23 } 24 }); 25 //通过字节码技术动态创建子类实例 26 service service = (service) enhancer.create(); 27 service.doSome(); 28
3.执行结果