`
ncs123
  • 浏览: 102928 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring之AOP

阅读更多
一、AOP术语
    Aspect(切面): aspect 由 pointcount 和 advice 组成, 它既包含了横切逻辑的定义,切面就是对横切关注点的抽象。
    pointcut(切点): 匹配 join point 的谓词(a predicate that matches join points)。
    advice(增强): 指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类。
    target(目标对象): 织入 advice 的目标对象. 目标对象也被称为 advised object。
    joinpoint(连接点): 程序运行中的一些时间点, 例如一个方法的执行, 或者是一个异常的处理。
    weave(织入): 将 aspect 和其他对象连接起来, 并创建 adviced object 的过程。也就是生成代理对象的过程。
    introduction(引入): 在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。

    总结: Aspect,pointcut,advice是一个抽象的整体,AOP织入 advice 的目标对象生成一个代理对象,通过pointcut规则拦截target中的joinpoint,并执行advice的代码。pointcut是定义规则,joinpoint是具体的方法和异常。

二、Java注解实现AOP
   AspectJ切入点指示符如下:
         execution:用于匹配方法执行的连接点;
         within:用于匹配指定类型内的方法执行;
         this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
         target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;
         args:用于匹配当前执行的方法传入的参数为指定类型的执行方法;
         @within:用于匹配所以持有指定注解类型内的方法;
         @target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
         @args:用于匹配当前执行的方法传入的参数持有指定注解的执行;
         @annotation:用于匹配当前执行方法持有指定注解的方法;
         bean:Spring AOP扩展的,AspectJ没有对于指示符,用于匹配特定名称的Bean对象的执行方法;
         reference pointcut:表示引用其他命名切入点,只有@ApectJ风格支持,Schema风格不支持。

       AspectJ切入点支持的切入点指示符还有: call、get、set、preinitialization、staticinitialization、initialization、handler、adviceexecution、withincode、cflow、cflowbelow、if、@this、@withincode;但Spring AOP目前不支持这些指示符,使用这些指示符将抛出IllegalArgumentException异常。这些指示符Spring AOP可能会在以后进行扩展。

// 使用 Java Configuration 方式使能@AspectJ
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
}

//定义切面
@Aspect
public class NotVeryUsefulAspect {
  // 定义切点 匹配transfer方法
  @Pointcut("execution(* transfer(..))")// the pointcut expression
  private void anyOldTransfer() {}// the pointcut signature

  // 定义advice transfer方法前执行
  @Before("com.xyz.myapp.NotVeryUsefulAspect.anyOldTransfer()")
  public void doAccessCheck() {
    // ...
  }

  //合@Pointcut合@Before一体
  @Before("execution(* transfer(..))")
  public void doAccessCheck2() {
    // ...
  }
}

三、XML实现AOP

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">

        <!-- 支持AOP功能配置 -->
        <aop:aspectj-autoproxy/>        

        <!-- 目标对象 -->
        <bean id="helloWorldImpl1" class="com.xrq.aop.HelloWorldImpl1" />
        <!-- advice对象 -->
        <bean id="timeHandler" class="com.xrq.aop.TimeHandler" />
        
        <aop:config>
            <!-- 切面 -->
            <aop:aspect id="time" ref="timeHandler">
                <!-- 切点 -->
                <aop:pointcut id="addAllMethod" expression="execution(* com.xrq.aop.HelloWorld.*(..))" />
                <!-- advice -->
                <aop:before method="printTime" pointcut-ref="addAllMethod" />
                <aop:after method="printTime" pointcut-ref="addAllMethod" />
            </aop:aspect>
        </aop:config>
</beans>


四、AOP代理

    AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理cglib动态代理
    JDK动态代理:
  1. 通过实现InvocationHandlet接口创建自己的调用处理器
  2. 通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理
  3. 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型
  4. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入

    JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,
Spring通过java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。


    CGLib动态代理
    CGLib是一个强大、高性能的Code生产类库,可以实现运行期动态扩展java类,Spring在运行期间通过 CGlib继承要被动态代理的类,重写父类的方法,实现AOP面向切面编程呢。

    比较:
  • JDK动态代理是面向接口,在创建代理实现类时比CGLib要快,创建代理速度快。
  • CGLib动态代理是通过字节码底层继承要代理类来实现(如果被代理类被final关键字所修饰,那么抱歉会失败),在创建代理这一块没有JDK动态代理快,但是运行速度比JDK动态代理要快。


        <!-- 默认实现接口的目标对象使用动态代理,未实现接口的使用CGLIB代理 -->
        <aop:aspectj-autoproxy/>

        <!-- 强制使用CGLIB代理 -->
        <aop:aspectj-autoproxy proxy-target-class="true"/>


参考资料:https://docs.spring.io/spring/docs/2.5.x/reference/aop.html#aop-using-aspectj
分享到:
评论

相关推荐

    Spring之AOP介绍

    ### Spring之AOP介绍 #### 一、AOP概述 面向方面编程(Aspect-Oriented Programming,简称AOP)作为一种编程范式,旨在通过模块化的方式处理横切关注点(Cross-cutting Concerns)。传统的面向对象编程(OOP)虽然...

    死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序.pdf

    Spring AOP 是一种面向切面编程的技术,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。在 Spring 中,AOP 的实现主要依赖于代理模式,有两种代理方式:JDK 动态代理和 CGLIB 动态...

    Spring之AOP配置文件详解

    ### Spring之AOP配置文件详解 #### 一、前言 在Java开发中,Spring框架因其强大的功能和灵活的配置而被广泛应用于企业级应用的开发。其中,面向切面编程(Aspect Oriented Programming,简称AOP)是Spring框架的...

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    spring之AOP(动态代理)

    在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者将关注点分离,将横切关注点(如日志、事务管理、权限检查等)与核心业务逻辑解耦。AOP的核心概念是切面、通知、连接点、切入点和织入。在...

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    Spring之AOP详细介绍 应用场景

    Spring之AOP详细介绍 应用场景

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...

    spring 之aop

    标题中的“Spring 之AOP”指的是在Spring框架中对面向切面编程(Aspect-Oriented Programming,简称AOP)的使用。AOP是软件设计的一种模式,它将关注点分离,使得我们可以独立地处理系统中的交叉关注点,如日志、...

    spring-aop-jar

    "spring-aop-jar"这个主题涉及到Spring框架中的核心组件之一——Spring AOP。这里我们将深入探讨Spring AOP、相关jar文件以及它们在实际开发中的作用。 首先,我们来看一下提供的文件: 1. aopalliance.jar:这是一...

    Spring之AOP在鉴权和日志记录中的应用

    **Spring AOP在鉴权和日志记录中的应用** **一、引言** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要特性,它为开发者提供了在不修改源代码的情况下,对应用程序进行功能增强...

    spring,spring-aop-5.3.22.jar+aop+IDEA本地包

    spring-aop-5.3.22.jar Spring AOP provides an Alliance-compliant aspect-oriented programming implementation allowing you to define method interceptors and pointcuts to cleanly decouple code that ...

    spring-aop-5.0.10.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.0.10.RELEASE.jar; 赠送原API文档:spring-aop-5.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.10.RELEASE....

    spring-aop-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.0.8.RELEASE.jar; 赠送原API文档:spring-aop-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.8.RELEASE.pom;...

    spring-boot aop

    Spring Boot AOP(面向切面编程)是一种强大的设计模式,它允许我们在不修改现有代码的情况下,插入额外的功能或监控代码。在Spring框架中,AOP主要用于日志记录、事务管理、性能统计等场景。本示例是关于如何在...

    spring-aop-6.0.2.jar

    spring-aop-6.0.2.jar

    spring-aop-5.3.12-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.3.12.jar; 赠送原API文档:spring-aop-5.3.12-javadoc.jar; 赠送源代码:spring-aop-5.3.12-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.3.12.pom; 包含翻译后的API文档:spring...

    J2EE_Spring之AOP与依赖注入例子

    依赖注入是Spring框架的核心特性之一,它帮助减少对象之间的耦合。在传统的Java代码中,对象常常通过构造函数、setter方法或全局变量来获取依赖。而依赖注入则是由外部容器(如Spring IoC容器)负责创建对象并管理...

    Spring 2.5 AOP 例子

    Spring 2.5 AOP(面向切面编程)是Java应用程序中的一个重要概念,它允许开发者在不修改原有代码的情况下插入新的行为或监控。这个例子旨在帮助我们理解和应用Spring框架的AOP特性。以下是对该主题的详细解释: 一...

    spring-aop-5.3.10-API文档-中文版.zip

    赠送jar包:spring-aop-5.3.10.jar; 赠送原API文档:spring-aop-5.3.10-javadoc.jar; 赠送源代码:spring-aop-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.3.10.pom; 包含翻译后的API文档:spring...

Global site tag (gtag.js) - Google Analytics