一、动态代理,这是一个很强大的东西哦。研发过程中我们会常用很多业务类,但是存在一个问题。如何在不修改源码逻辑的情况下,加入自己的相关逻辑。比如异常处理,日志记录等!

  二、Java动态代理的两种方式JDK、CGLIB

  三、动态代理的例子

  1)需要代理的类 

public interface  AspectExcuteParent {
void test();
} public class AspectExcuteChild implements AspectExcuteParent{
public void test() {
System.out.println("test");
}
}

  2)JDK代理(因为JDK的代理是基于接口做的,所以需要实现一个接口)

  public static void main(String[] args) {
//创建代理
AspectExcuteParent aspectExcuteParent = (AspectExcuteParent) Proxy.newProxyInstance(
//classloader
Thread.currentThread().getContextClassLoader(),
//代理接收的接口
AspectExcuteChild.class.getInterfaces(),
//代理类
new TestInvocationHandler(new AspectExcuteChild()));
aspectExcuteParent.test();
} static class TestInvocationHandler implements InvocationHandler{
//所以私有化,目的执行
private Object object; public TestInvocationHandler(Object object) {
super();
this.object = object;
} /**
* @param proxy (代理实例)
* @param method (方法)
* @param args (参数)
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before");
Object result = method.invoke(object, args);
System.out.println("after");
return result;
}
}

  3)cglib的实现方式(基于类的方式实现)

  public static void main(String[] args) {
//CGLIB创建类
Enhancer enhancer = new Enhancer();
//设置目标代理
enhancer.setSuperclass(AspectExcuteChild.class);
//设置回掉
enhancer.setCallback(new TestMethodInterceptor(new AspectExcuteChild()));
//创建代理
AspectExcuteChild aspectExcuteChild = (AspectExcuteChild) enhancer.create();
aspectExcuteChild.test();
} static class TestMethodInterceptor implements MethodInterceptor {
//保存的原始对象
private Object object; public TestMethodInterceptor(Object object) {
super();
this.object = object;
} @Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//方法拦截处理
System.out.println("before");
Object result = method.invoke(object, objects);
System.out.println("after");
return result;
}
}

  四、动态代理的例子就这么多,aop中对代理进行了封装,但是基本处理方式就是这样的。

  

spring源码-aop动态代理-5.3的更多相关文章

  1. Spring源码-AOP部分-Spring是如何对bean实现AOP代理的

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 历史文章 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] S ...

  2. spring源码-aop源码-5.1

    一.aop的源码部分还是有点复杂的,但是为了更好的理解,我这里会省去很多不必要的逻辑实现过程.主要方向还是更好的理解整体代码的实现过程. 二.说明重点:aop的过程主要过程有两点:第一点,发现正确和适 ...

  3. MyBatis 源码分析——动态代理

    MyBatis框架是如何去执行SQL语句?相信不只是你们,笔者也想要知道是如何进行的.相信有上一章的引导大家都知道SqlSession接口的作用.当然默认情况下还是使用DefaultSqlSessio ...

  4. spring源码-aop增强-5.2

    一.aop增强就是针对于不同的切面进行的相关增强,目的当然是更好的支持相关应用和解耦. 二.默认的aop增强类有AspectJMethodBeforeAdvice.AspectJMethodBefor ...

  5. spring源码-aop-5

    一.在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发 ...

  6. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

  7. spring源码分析(二)Aop

    创建日期:2016.08.19 修改日期:2016.08.20-2016.08.21 交流QQ:992591601 参考资料:<spring源码深度解析>.<spring技术内幕&g ...

  8. spring源码学习之路---深入AOP(终)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章和各位一起看了一下sp ...

  9. spring源码学习之路---AOP初探(六)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近工作很忙,但当初打算学习 ...

随机推荐

  1. UVa 12230 - Crossing Rivers(数学期望)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  2. 1085. [SCOI2005]骑士精神【IDA※】

    Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2 ...

  3. 【YY的GCD】

    设 \[f(n)=\sum_{i=1}^N\sum_{j=1}^M[(i,j)=n]\] 我们的答案显然是 \[ans=\sum_{p\in prime}f(p)\] 设 \[F(n)=\sum_{i ...

  4. Java50道经典习题-程序13 根据条件求数字

    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?分析:完全平方数:如果一个数能是由两个相同的数相乘的结果,那么这个数就是完全平方数,例如:9==3*3: ...

  5. 从零搭建vue

    第一步: 安装node.js,一般安装 长期维护版  相对比较稳定 点击下载,下载好了之后双击运行,可选择安装路径,然后一路下一步即可. 安装完成后,在cmd输入 node -v 如果出现版本号,则安 ...

  6. Struts2通配符

    action: struts: or: 请求路径:

  7. HDU 2544最短路 (迪杰斯特拉算法)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2544 最短路 Time Limit: 5000/1000 MS (Java/Others)    Me ...

  8. VPP(Vector Packet Processing)浅析

    VPP简介 VPP(Vector Packet Processing)是思科旗下的一款可拓展的开源框架,提供容易使用的.高质量的交换.路由功能 特点:高性能.运行在普通的cpu上. 优点:高性能.技术 ...

  9. HTML5手机端拍照上传

    1.accept="image/*" capture="camera" 自动调用手机端拍照功能 accept="image/*" captu ...

  10. C#中参数传递

    当调用带有参数的方法,需要向方法传递参数,有三种向方法传递参数的方式. 1.值参数:这种方式复制参数的实际值给形式参数,形参和实参使用的是内存中两个不相同的值,形参发生改变不会影响实参的值,从而保证了 ...