一、使用jdk自带的动态代理机制:

  • 定义一个普通的接口及实现类;
  • 定义一个InvocationHandler的实现类用于织入横向插入的操作(此处为打印信息);
  • 生成接口的代理类;
  • 调用接口方法,实现动态代理。
  • package aopdemo.jdk;public interface INormalService {public void service();}

    package aopdemo.jdk;public class NormalServiceImpl implements INormalService {@Overridepublic void service() {System.out.println("invoke service");}}

    package aopdemo.jdk;import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandler {Object target;public MyInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {System.out.println("before service");Object object = method.invoke(target, args);System.out.println("after service");return object;}}

    package aopdemo.jdk;import java.lang.reflect.Proxy;public class JdkProxyDemo {public static void main(String[] args) {INormalService normalService = new NormalServiceImpl();MyInvocationHandler handler = new MyInvocationHandler(normalService);INormalService iNormalService = (INormalService) Proxy.newProxyInstance(normalService.getClass().getClassLoader(),normalService.getClass().getInterfaces(), handler);iNormalService.service();}}

    执行结果为:

before service
         invoke service
         after service

二、使用Cglib实现动态代理

  • 定义一个普通的类;
  • 定义一个MethodInterceptor的实现类用于织入横向插入的操作(此处为打印信息);
  • 使用enhancer增强器生成普通类的代理类;
  • 调用代理类的方法,实现动态代理。
package aopdemo.cglib;public class NormalServiceImpl {public void service() {System.out.println("invoke service");}}

package aopdemo.cglib;import java.lang.reflect.Method;import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {@Overridepublic Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable {System.out.println("before service");Object object = proxy.invokeSuper(obj, args);System.out.println("after service");return object;}}

package aopdemo.cglib;import net.sf.cglib.proxy.Enhancer;public class CglibDemo {public static void main(String[] args) {CglibProxy cglibProxy = new CglibProxy();Enhancer enhancer = new Enhancer();enhancer.setSuperclass(NormalServiceImpl.class);enhancer.setCallback(cglibProxy);NormalServiceImpl normalServiceImpl = (NormalServiceImpl) enhancer.create();normalServiceImpl.service();}}

最后输出:

before service
invoke service
after service

三、总结

jdk代理只能动态代理接口;

Cglib代理可以代理普通的类。

四、spring如何配置代理方式?

<aop:aspectj-autoproxy proxy-target-class="true" />

若配为true表示强制使用Cglib来代理;

若不配为true:

如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);

如果要被代理的对象不是个实现类,Spring会强制使用Cglib来实现动态代理。

java动态代理(AOP)相关推荐

  1. Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP

    Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP xBird 原创  (参与分:36,专家分:90)   发表:2004-9-3 上午9:37   版本:1.0   阅读:160 ...

  2. Java 动态代理实践AOP

    2019独角兽企业重金招聘Python工程师标准>>> 大家都知道Spring中AOP是通过Java动态代理实现的,今天就来简单学习下demo. Java动态代理主要有两个核心类,I ...

  3. java动态代理实现与原理详细分析(代码层面解释了AOP的实现)

    关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 一.代理模式    代理模式是常用的java设计模式, ...

  4. (转)java动态代理与aop

    转自: Java 动态代理与AOP - 如果的事 - 博客园动态代理与AOP 代理模式 代理模式给某一个目标对象(target)提供代理对象(proxy),并由代理对象控制对target对象的引用. ...

  5. 用Java动态代理实现AOP

    在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述用Java动态代理实现AOP,更多Java专业知识,广州疯狂java培训 ...

  6. JAVA基础资料 Java动态代理实现AOP

    Java动态代理实现AOP 目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jb ...

  7. Java动态代理的实现

    动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. ...

  8. Java动态代理与Cglib代理

    为什么80%的码农都做不了架构师?>>>    最近又继续回来死磕Spring源码,以前看的也忘得差不多了,这次先把Spring使用的动态代理cglib看了一下,打好基础知识. cg ...

  9. 初看Mybatis 源码 (二) Java动态代理类

    先抛出一个问题,用过Mybatis的都知道,我们只需要定义一个Dao的接口,在里面写上一些CRUD相关操作,然后配置一下sql映射文件,就可以达到调用接口中的方法,然后执行sql语句的效果,为什么呢? ...

  10. java动态代理上是否能再进行一层代理

    CGLIB动态代理类 import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.p ...

最新文章

  1. AngularJS $eval $parse
  2. 如何搞定分库后数据冗余
  3. python使用缩进作为语法边界一般建议怎样缩进-python基础自测挑战题,适合刚起步不久的小猿!...
  4. 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements )
  5. 利用JS调用aspx页面(转载)
  6. Docker添加或者更改容器的端口映射
  7. python visual studio pandas_pandas DataFrame索引行列的实现
  8. html与js二级菜单横排,JavaScript实现横向滑出的多级菜单效果
  9. Tomcat 又爆出高危漏洞!Tomcat 8.5~10 中招…
  10. linux下tomcat缓存磁盘文件,Linux环境下清理Tomcat缓存
  11. js调用微信扫一扫demo_微信JSSDK调用微信扫一扫功能的方法
  12. eclipse SWT 中实现工程图标最小化到托盘,并只能右键托盘图标选择关闭
  13. 业务持续计划(BCP,Business Continuity Plan)
  14. kettle MongoDB数据迁移至Hbase
  15. Final shell配置
  16. 计算机图形学基础徐文鹏知识点,计算机图形学基础(OpenGL版)
  17. A brief introduction to complex analysis
  18. 联想网络计算机云终端,联想云终端v300 服务器
  19. 【Python小游戏】俄罗斯方块
  20. uniapp适配ipad端平板端

热门文章

  1. 王者荣耀用什么开发的
  2. 同步fifo与异步fifo
  3. Django企业开发实战--by胡阳,学习记录1117
  4. 网络安全规范(范例)
  5. 盛元广通医院实验室设备预约管理系统
  6. 屏幕尺寸、分辨率、视口笔记
  7. 阿里云python自测答案_阿里云技能测试python初级中级高级
  8. Beeline – 命令行参数详解
  9. Access-Control-Allow-Origin配置报错
  10. .fla文件的链接类在.swf中的体现