Spring-AOP的原理-动态代理-IOC-注解配置

一:概念的介绍:

    什么叫AOP?

《Spring-AOP的原理-动态代理-IOC-注解配置》

          关键:  横向重复,纵向提取;

        AOP能为容器中管理的对象动态生成代理对象,AOP是指编程不是针对某一个对象,而是针对一群对象,打个比方:就像一个一个个圆柱形,这一个个圆柱形就是一个个对象,OOP思想就是往这个圆柱里面填充方法,属性等等,但是AOP的思想就是,把这个圆柱切开,把一些通用的东西加进去,常见的如 日志,事件等等。AOP是一种思想,并一定要用动态代理的方式来实现,想过滤器,拦截器等都是AOP的思想;

    连接点:目标对象中,所有可以被增强的方法叫做连接点;

    切入点:已经被增强的方法叫做切点:

    通知/增强:增强的内容(代码),有前置通知,环绕通知,后置通知,异常通知等,常见的如:事务,日志等;

    目标对象:被代理对象;

    织入:就是把通知和连接点连接,形成切点的过程;

    代理:将通知织入目标对象之后形成代理对象;

    切面:切入点加通知就叫切面;

二:AOP的实现原理:

    AOP有两种实现方式:动态代理和CGlib代理;

    动态代理:动态代理需要的条件就是需要目标对象实现的接口,如果没有接口的话就不能使用动态代理模式;则只能使用    CGlib(Code Generation Library)代理模式;也是Spring默认代理方式;

     CGlib代理模式:是通过继承的方式,形成目标对象的子类,对子类进行增强,从而形成代理,所有当父类被final修饰的时候,那么这个时候就不能使用CGlib代理了;

    补充:无论是动态代理还是CGlib代理,要实现的目的就是为了能够在编程的时候,完成声明式编程–就是我通过声明就可以得到我想要的对象,不需要再对考虑某个类的信息在进行修改。就是AOP的思想。他想要实现能在运行的过程中,动态的修改对象的信息,但是JVM是不支持这么做的,于是引进了一项技术—-ASM,这个ASM就是能够在虚拟机中动态的修改字节码中信息,动态的修改已生成的class,而且可以动态的生成新的Class,    CGlib代理其实就是这个ASM对上层封装。从而才能构成了代理,动态代理生成的是“兄弟”,CGlib代理生成的是“孩子”。还有一个就是CGlib代理技术对原类 方法进行访问的时候不不是使用的是反射技术,而是FastClass技术,所以CGlib技术一般生成对象的时候,比较慢,但是运行的时候比较快。而动态代理就是生产的是一个新的类,这个类和被代理的类继承同一个接口,新生成的类中加入要添加的方法,这个新生成的类作为真实对象的代理来处理事情,就是动态代理。

动态代理让代理类和目标类实现同一个接口,cglib生成一个目标类的子类。mybatis用的动态代理,spring两种都用,以前经常会使用接口bean,号称动态代理比cglib稳定,但动态代理性能远不如cglib。

三:IOC(Inverse Of Control)反转控制

    简而言之,就是将创建对象的权利反转了,我们以前的对象都是自己创建的,包括依赖关系也是自己注入的,但是有了Spring之后,对象的创建以及依赖的注入都可以由Spring来完成了。

    但是Spring创建对象的时候,那些对象所依赖的信息怎么来呢?比如:我要创建一个Tom这个人,这个人的姓名是Tom,年龄是18,那么我就要告诉Spring这些信息,这就引入了另一个概念:依赖注入(DI  Dependency Injection)

    依赖注入的方式:

                构造器;

                set方法;

                字段注入;

    注入的类型:值类型和引用类型;

四:注解配置

    注解的通俗解释:注解,可以理解成一种元数据,也就是对数据进行描述的数据,比如说,当虚拟机看到一个方法的时候,如果上面有@Override ,虚拟机就知道他是他父类或者接口的重写了,这里的注解也是为了这个意思,当虚拟机看到注解的时候,就能知道这个方法的作用,从而生成你想要的相应功能。他可以节省xml繁琐的配置。

    Resource和autowired的区别:

    Resource是javax.annotation.Resource 下面的类,并不是Spring里面的注解;他的默认是使用ByName自动注入的;

    autowried则是Spring自带的注解;默认使用的是ByType类型注入的,默认情况下要求依赖的对象必须是存在的,如果允许为null,可以设置他的required为false;

    两者都可以对字段和set方法进行注入;

    原文作者:AOP
    原文地址: https://blog.csdn.net/qq_34144916/article/details/80848147
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞