为了账号安全,请及时绑定邮箱和手机立即绑定

探秘Spring AOP

apollo JAVA开发工程师
难度高级
时长 2小时30分
学习人数
综合评分9.67
84人评价 查看评价
9.9 内容实用
9.4 简洁易懂
9.7 逻辑清晰
  • MethodInterCeptor

    与JDK的InvocationHandler类似

    用方法反射调用目标对象的方法,把真正的业务逻辑委托给目标对象


    查看全部
    0 采集 收起 来源:cglib动态代理

    2019-10-22

  • Cglib实现: 

    1:生成指定类对象的子类,也就是重写类中的业务函数。

     2:执行回调函数,加入intercept()函数。 

    3:创建这个类的子类对象。

     ----------------------------------------- 

    反射技术实现; methodProxy.invokeSuper();


    查看全部
    0 采集 收起 来源:cglib动态代理

    2019-10-22

  • 保存生成的字节码:System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");


    public class Client {


        public static void main(String[] args){
            System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
            Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]{Subject.class},new JdkProxySubject(new RealSubject()));
            subject.hello();
        }
    }
    查看全部
  • jdk运行期动态代理源码解析:其实就是真实类实现一个接口,我们再写一个类似于切面的类,实现invocationhandler接口且实现invoke方法,同时要保存真实类对象,初始化时赋值对象,invoke方法中反射方式调用真实对象方法,在方法前后可以加上定制的逻辑,这个方法其实是动态代理对象调用的,动态代理对象是客户端通过动态代理类实例化的,而动态代理类是真实对象方法执行前的运行期生成的.class类,这个类实现了和真实对象一样的接口,所以也有真实对象的方法,调用代理对象方法时也就可以传入参数,然后代理对象再将方法和参数传递给invocationhandler的实例对象。

    查看全部
  • public class Client {

        public static void main(String[] args){
          
            Subject subject = (Subject) Proxy.newProxyInstance(Client.class.getClassLoader(),new Class[]{Subject.class},new JdkProxySubject(new RealSubject()));
            subject.hello( );
        }
    }


    查看全部
    0 采集 收起 来源:jdk代理演示

    2019-10-22

  • /**<br/>&nbsp;* aspect<br/>&nbsp;* Created by cat on 2017-02-27.<br/>&nbsp;*/<br/>public class JdkProxySubject implements InvocationHandler{<br/><br/>&nbsp;&nbsp;&nbsp; private RealSubject realSubject;<br/><br/>&nbsp;&nbsp;&nbsp; public JdkProxySubject(RealSubject realSubject) {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.realSubject = realSubject;<br/>&nbsp;&nbsp;&nbsp; }<br/><br/>&nbsp;&nbsp;&nbsp; @Override<br/>&nbsp;&nbsp;&nbsp; public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;before&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object result = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = method.invoke(realSubject,args);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch (Exception e){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;ex:&quot;+e.getMessage());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw e;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }finally {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(&quot;after&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br/>&nbsp;&nbsp;&nbsp; }<br/>}<br/>jdk根据反射机制,创建Subject实例的。因为在调用Proxy的newProxyInstance方法时,会传入一个class泛型接口数组,jdk内部源码会根据你传入的参数进行反射,并创建该接口的实现类实例,最后调用该实例的方法。<p><br/></p><p></p>
    查看全部
    0 采集 收起 来源:jdk代理演示

    2020-09-11

  • 静态代理与动态代理

    查看全部
    0 采集 收起 来源:jdk代理演示

    2019-10-22

  • JDK实现要点

    查看全部
    0 采集 收起 来源:jdk代理演示

    2019-10-22

  • 被代理接口类:

    /**
     * Created by cat on 2017-02-27.
     */
    public interface Subject {
        void request();
        void hello();
    }

    实现被代理类接口的代理类:

    public class RealSubject implements Subject{
        @Override
        public void request() {
            System.out.println("real subject execute request");
        }

        @Override
        public void hello() {
            System.out.println("hello");
        }
    }
    代理对象的类:

    public class Proxy implements Subject{

        private RealSubject realSubject;

        public Proxy(RealSubject realSubject) {
            this.realSubject = realSubject;
        }

        @Override
        public void request() {
            System.out.println("before");
            try{
                realSubject.request();
            }catch (Exception e){
                System.out.println("ex:"+e.getMessage());
                throw e;
            }finally {
                System.out.println("after");
            }
        }

        @Override
        public void hello() {
            realSubject.hello();
        }
    }
    客户端调用代理类:实际调用的是代理的实现类,而代理的实现类具体业务又是委托给RealSubject来执行的
    /**
     * Created by cat on 2017-02-27.
     */
    public class Client {

        public static void main(String[] args){
            Subject subject = new Proxy(new RealSubject());
            subject.request();
        }
    }

    查看全部
    0 采集 收起 来源:代理模式

    2019-10-22

  • 1、客户端通过接口引用目标对象或代理对象,这里体现了面向对象的面向接口,客户端调用的目标对象的方法,代理对象都要有,因此目标对象和代理对象共同作为接口的实现类

    2、代理对象把真正的方法委托给目标对象来执行,自己就执行额外的也就是AOP要织入的逻辑,即客户端调用代理的方法,同时给代理类传入目标对象,在代理类里面代理类通过目标对象来调用目标类的方法,在执行方法前后加上代理类的逻辑

    查看全部
    0 采集 收起 来源:代理模式

    2019-10-22

  • 代理AOP对象

    caller:调用方

    target:目标对象

    proxy:代理对象

    客户端通过代理对象间接地和目标对象交互

    目标对象委托了代理对象来跟客户端交互


    查看全部
    0 采集 收起 来源:代理模式

    2019-10-22

  • 原理概述:运行时织入
    查看全部
    0 采集 收起 来源:概述

    2019-10-22

  • 原理概述:运行时织入

    查看全部
    0 采集 收起 来源:概述

    2019-10-22

  • 内容大纲:

    查看全部
  • @After在代码执行之后的植入
    查看全部
    0 采集 收起 来源:advice注解

    2019-10-22

举报

0/150
提交
取消
课程须知
本课程有一定的难度,需要同学较为熟练的掌握Spring和Spring Boot相关知识。熟练配置mysql,mongodb和maven项目。本课程将带领大家对源码进行刨析!不熟悉相关内容的同学可先学习SSM免费路径上的课程和慕课网上Spring Boot的基础课(http://www.imooc.com/learn/767)。
老师告诉你能学到什么?
让学生了解SpringAop的原理,使用,解读SpirngAop的经典代码,再通过案例加深让学生对SpirngAop的理解和掌握的程度

微信扫码,参与3人拼团

意见反馈 帮助中心 APP下载
官方微信
友情提示:

您好,此课程属于迁移课程,您已购买该课程,无需重复购买,感谢您对慕课网的支持!