spring中使用动态代理(AOP)
生活随笔
收集整理的这篇文章主要介绍了
spring中使用动态代理(AOP)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
spring是整合了BGLIB和JDK两种动态代理
示例:使用CGLIB代理
public class MyCar {private String color = "blue";public void run() {System.out.println("我的汽车跑起来了" + color);} }测试
public class SpringProxy {public static void main(String[] args) {//将代理类的class文件保存到本地System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "E:\\Java4IDEA\\comm_test\\com\\sun\\proxy");ProxyFactory proxyFactory = new ProxyFactory(new MyCar());//添加前后置通知addAdivce(proxyFactory);proxyFactory.setProxyTargetClass(true);MyCar proxy = (MyCar) proxyFactory.getProxy();proxy.run();} }使用JDK代理
被代理的对象需要实现接口
public interface Car {void run(); }调用
public static void main(String[] args) throws Exception {System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");ProxyFactory proxyFactory = new ProxyFactory(new MyCar());addAdivce(proxyFactory);// proxyFactory.setProxyTargetClass(true);Car proxy = (Car) proxyFactory.getProxy();proxy.run(); }如果想添加前后置通知 如下
private static void addAdivce(ProxyFactory proxyFactory) {proxyFactory.addAdvice(new MethodInterceptor() {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {Object aThis = invocation.getThis();System.out.println("MethodInterceptor前置:"+aThis);//执行被代理对象的方法,返回方法的返回值Object proceed = invocation.proceed();System.out.println("MethodInterceptor后置");return proceed;}});//可以添加多个方法前置或者后置通知proxyFactory.addAdvice(new AfterReturningAdvice() {@Overridepublic void afterReturning(Object returnValue, Method method,Object[] args, Object target) throws Throwable {System.out.println("AfterReturningAdvice后置通知");}});proxyFactory.addAdvice(new MethodBeforeAdvice() {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("MethodBeforeAdvice前置通知");}});}JDK生成的动态类
public final class $Proxy0 extends Proxy implements Car, SpringProxy, Advised, DecoratingProxy {...public final void run() throws {try {super.h.invoke(this, m3, (Object[])null);} catch (RuntimeException | Error var2) {throw var2;} catch (Throwable var3) {throw new UndeclaredThrowableException(var3);}} }源码与JDK的代理和CGLB的代理源码大同小异,可以自行查阅
也可以参考 代理模式
转载于:https://www.cnblogs.com/qiaozhuangshi/p/11185099.html
总结
以上是生活随笔为你收集整理的spring中使用动态代理(AOP)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: dubbo中使用动态代理
- 下一篇: 到底使用接口还是抽象类