spring的AOP和IOC的原理

目录

一、spring的ioc与aop原理

二、代理模式:

三、静态代理

四、动态代理

五、实际的操作

六、动态代理的实现:

七、什么是AOP

八、主流的AOP框架:

九、术语:

十、通知的五种类型:

十一、AOP的优点:

十二、AOP开发流程


一、spring的ioc与aop原理

  • 核心概念:控制反转(IOC)/(DI),面向切面(AOP)

        IOC和DI:本质相同只是不同的角度描述而已。

        IOC:

                使用Spring框架之后对象的实例不再由调用者来创建,而是直接由Spring容器来创建,Spring容器会负责控制程序之间的关系,而不是调用者的程序代码直接控制。控制权由应用程序转移到Spring容器,控制权发生了反转。

        DI:

                从Spring容器的角度来看,Spring容器负责被依赖对象赋值给调用者的长远变量,这相当于为调用者注入了它依赖的实例,这就是Spring的依赖注入。

aop(面向切面编程) 原理:
    由于组件是在运行期间组装、调用的,因此Spring即可以在执行完A组件后执行组件B,也可以执行完A组件后执行B组件前再执行C组件。也就是说,将C组件插入到A组件与B组件之间。
    如果把A、B、C看成是切面,这就是AOP、面向切面的编程。面向切面编程的思想就是在执行某些代码前执行另外的代码,使程序更灵活、扩展性更好,可以随便地添加、删除某些功能。
 

spring的AOP和IOC的原理_第1张图片
  • 二、代理模式:

    • 概念
      • 是程序设计的一种
      • 代理模式就是为其他的对象提供一种代理以控制这个对象的访问某些情况下每个对象不适合或者不能直接引用另一个对象二代理对象可以在客户端与目标对象之间起到中介的作用
    • 组成:
      spring的AOP和IOC的原理_第2张图片
      1. 抽象角色:【行为】
        • 通过接口或者抽象类声明真实角色的实现(业务方法)
      2. 代理对象【连接真实角色的桥梁】
        • 实现抽象角色,是真实角色的代理,通过真实的 角色的业务逻辑方法,来实现抽象方法,附加自己的操作。
      3. 真实角色【需要被代理的对象】
        • 实现抽象角色,定义镇海寺的角色搜要实现的业务逻辑,提供代理角色调用
  • 三、静态代理

    • 由我们创建或者工具生成的代理,字编译代理类,所谓的惊涛代理就是在程序执行之前九已经存爱的代理类,代理类和委托类的关系在运行之前就已经确定了。
  • 四、动态代理

    • 动态代理凭借灵活性子框架中应用非常的广泛,是代理模式的一种
    • 是在实现阶段不关心代理类,而是在运行阶段才指定哪一个对象,这就意味着不关心代理类是如何实现的,不需要再写代理类。
  • 、实际的操作

    ​​​​​​​
    • 代理类中没有真实的实现接口,而是调用目标类的租房rent方法。
  • 六、动态代理的实现:

    • 在程序的执行过程中,使用JDK的反射机制,创建代理类对象,并动态的指定要代理的目标类。
    • 它可以实现不用写代理类的实现就可以创建代理类对象。
    • JDK的动态代理是就与反射 实现的,使用JDK中接口和类实现代理对象的创建。
    • JDk动态代理必须实现三个类 Method ,Proxy,InovcationHandler
  • 七、什么是AOP

    • 面向切面编程,和OOP(面向对象编程)类似,一也是一种编程思想。
    • AOP的 作用【横向抽取机制】
      • AOP采取横向抽取【动态代理】,对啊了传统纵向继承的重复性代码,器应用主要体现在事务处理,日志管理,权限管理,异常处理等方面。
      • 主要作用:
        • 分离功能性需求和非功能性需求,是开发人员可以集中 的处理某一个关注点或者横切逻辑
        • 减少对业务代码的侵入
        • 增强代码的可读性和可维护性【简单来说,AOP的作用就是保证开发者在不修改源代码的前提下,为系统业务组件添加某种通用的功能,AOP就是代理模式的经典应用】
  • 八、主流的AOP框架:

    • Spring AOP 
      • 基于AOP编程模式的一个框架,能够有效的减少系统 间的代码重复,达到松耦合的目的。
      • 纯java实现,不需要专门的编译器和类加载器,在运行期间通过代理方式象目标类植入增强的代码。
    • ASpectJ
      • 基于java语言的AOP框架,提供专门的编译器,在编译时提供横向代码的植入。
  • 九、术语:

    • Target:目标类【需要被代理的类】
    • Joinpoint:连接点【指哪些可能被拦截的方法】
    • PointCut:切入点【已经被增强的连接点】
    • Advice:通知/增强【增强代码(前置通知,后置通知,返回通知,抛出异常通知,环绕通知)】
    • WeaVing:植入【把增强的方法,应用到目标的Target来创建新的代理对象Proxy的过程】
    • Proxy:代理类
    • Aspect:切面平【是切入点+通知的结合】
  • 十、通知的五种类型:

    • before:前置通知
    • after:后置通知
    • after-returning:返回后通知
    • after-throwing:抛出异常后通知
    • around:环绕通知
  • 十一、AOP的优点:

    • 是Spring的核心之一,使用AOP来优化编程,在Spring框架中使用AOP的主要优势:
      1. 提供声明式企业服务:
        • 特别是作为EJB声明式服务的替代品,最重要 的是这种事务是声明式事务。
      2. 自定义切面:
        • 允许用户实现自定义切面。在默写不适应OOP编程的场景中吗,采用AOP来补充
      3. 耦合度降低:
        • 可以对业务逻辑的各个部分进行隔离,从而实业务逻辑的各个部分之间的耦合度降低,提高程序的可重用性,同时也提高了开发。
  • 十二、AOP开发流程

    id ="userService" class ="com.shang.aopdemo02.UserServiceImpl" >
    id="AOPAdvice" class="com.shang.rentdemo.UserAop">
    <aop:config>
    <aop:pointcut id="pointcut" expression="execution(* com.shang.aopdemo02.*.add*(..))"/>
    <aop:aspect ref="AOPAdvice">
    <aop:before pointcut-ref="pointcut" method="beforeAdvice" >aop:before>
    <aop:after pointcut-ref="pointcut" method="afterAdvice">aop:after>
    <aop:after-returning pointcut-ref="pointcut" method="afterReturnAdvice" >aop:after-returning>
    <aop:around pointcut-ref="pointcut" method="aroundAdvice">aop:around>
    <aop:after-throwing pointcut-ref="pointcut" method="afterThrowAdvice" >aop:after-throwing>
    aop:aspect>
    aop:config>
    1. 导入依赖
    2. 在xml文件中加入
      1. < ? xml version= "1.0" encoding= "UTF-8" ? >
      2. "Index of /schema/beans"
      3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      4.     xmlns:aop="Index of /schema/aop"
      5.     xsi:schemaLocation="Index of /schema/beans
      6.     http://www.springframework.org/schema/beans/spring-beans-xxx.xsd
      7.     Index of /schema/aop
      8.     http://www.springframework.org/schema/aop/spring-aop-xxx.xsd ">
    3. AOP的增强类【before after 等方法】
    4. 实现的第一种方式:在xml自定义切面实现
    5. 实现的第二种方式:注解
      1. 在xml中开启注解和扫描包
      2. 在方法的上面加上注解
        1. @Aspect:定义一个切面
        2. @Pointcut:用于定义一个切入点
        3. @Before:定义前置通知
        4. @After:定义最终通知
        5. @AfterReturning:定义后置通知
        6. @Around:定义环绕通知
        7. @AfterThrowing:定义抛出通知

你可能感兴趣的:(spring,单例模式,java)