浅析Spring基于注解的AOP

目录
  • 一、准备工作
  • 二、基于注解的AOP之前置通知
  • 三、基于注解的AOP之切入点表达式的语法和重用以及获取连接点的信息
    • ①切入点表达式的语法
    • ②获取连接点的信息
    • ③重用写入点表达式

一、准备工作

①创建一个Maven工程

②添加依赖

在IOC所需依赖基础上再加入下面依赖即可:

<!-- spring-aspects会帮我们传递过来aspectjweaver -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>5.3.1</version>
</dependency>

③把上节的接口和实现类复制过来,因为我们要在这个环境里面测试

二、基于注解的AOP之前置通知

如果我们要实现AOP的话,它也是要在我们的IOC的基础上实现的,所以说我们必须要把切面还有目标对象交给IOC容器来管理

AOP 抽横切关注点(非核心业务代码)

①创建切面类并配置

/**
 * 在切面中,需要通过指定的注解将方法标识为通知方法
 * @Before:前置通知,在目标对象方法执行之前执行
 */
@Component
@Aspect //将当前组件标识为切面
public class LoggerAspect {
    @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
    public void beforeAdviceMethod() {
        System.out.println("LoggerAspect,前置通知");
    }
}

②创建Spring配置文件,让ioc对我们的目标对象进行管理

    <!--
        AOP的注意事项:
        切面类和目标类都需要交给IOC容器管理
        切面类必须通过@Aspect注解标识为一个切面
        在Spring的配置文件中设置<aop:aspectj-autoproxy />开启基于注解的AOP
    -->
    <context:component-scan base-package="com.tian.spring.aop.annotation"></context:component-scan>
    <!--开启基于注解的AOP-->
    <aop:aspectj-autoproxy/>

测试类:

public class AOPTest {
    @Test
    public void testAOPByAnnotation() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
        Calculator calculator = ioc.getBean(Calculator.class);
        calculator.add(1,2);
    }
}

三、基于注解的AOP之切入点表达式的语法和重用以及获取连接点的信息

1.在切面中,需要通过指定的注解将方法标识为通知方法

@Before:前置通知,在目标对象方法执行之前执行

2.切入点表达式:设置在标识通知的value属性中

execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))

execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))

第一个*表示任意的访问修饰符和返回值类型

第二个*表示类中任意的方法

..表示任意的参数列表

类的地方也可以使用*,表示包下所有的类

①切入点表达式的语法

上述已经将我们的前置通知,通过切入点表达式作用到了我们的连接点上,下面我们来说是细节问题,因为我们设置得还不是很完美,就比如上面实现了后只能作用与我们的add方法,因为我们的切入点表达式是写死了的,下面我就来进行更完美的代码实现

将切面类中的切入点表达式修改为如下

/**
 *
 * 切入点表达式:设置在标识通知的value属性中
 * execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))
 * execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))
 * 第一个*表示任意的访问修饰符和返回值类型
 * 第二个*表示类中任意的方法
 * ..表示任意的参数列表
 * 类的地方也可以使用*,表示包下所有的类
 */
@Component
@Aspect //将当前组件标识为切面
public class LoggerAspect {
//    @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
    @Before("execution(* com.tian.spring.aop.annotation.*.*(..))")
    public void beforeAdviceMethod() {
        System.out.println("LoggerAspect,前置通知");
    }
}

测试类:

public class AOPTest {
    @Test
    public void testAOPByAnnotation() {
        ApplicationContext ioc = new ClassPathXmlApplicationContext("aop-annotation.xml");
        Calculator calculator = ioc.getBean(Calculator.class);
        calculator.sub(1,2);
    }
}

②获取连接点的信息

获取连接点的信息

在通知方法的参数位置,设置JoinPoint类型的参数,就可以获取连接点所对应方法的信息 获取连接点所对应方法的签名信息

Signature signature = joinPoint.getSignature();

获取连接点所对应方法的参数

Object[] args = joinPoint.getArgs();

System.out.println("LoggerAspect,方法:" + signature.getName() + ",参数" + Arrays.toString(args));

我们在之前的动态代理里面,我们在前置通知的位置,也就是在我们目标对象的方法执行之前,然后我们在方法体中输出的是我们要调用的方法的方法名,还有就是我们当前的参数列表,但是我们用了前置通知之后,我们不知道如何获取了,还没有我们动态代理实现的功能多。而且连接点的信息我们都获取不到,也就是我当前要加入通知的方法,它的一些信息我们都获取不到。其实我们也是可以获取到的,下面我就来实现

//    @Before("execution(public int com.tian.spring.aop.annotation.CalculatorImpl.add(int,int))")
//    @Before("execution(* com.tian.spring.aop.annotation.*.*(..))")
    @Pointcut("pointCut()")
    public void beforeAdviceMethod(JoinPoint joinPoint) {
        //获取连接点所对应方法的签名信息
        Signature signature = joinPoint.getSignature();
        //获取连接点所对应方法的参数
        Object[] args = joinPoint.getArgs();
        System.out.println("LoggerAspect,方法:" + signature.getName() + ",参数" + Arrays.toString(args));
    }

③重用写入点表达式

重用切入点表达式

//@Pointcut声明一个公共的切入点表达式

@Pointcut("execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))") public void pointCut() {}

使用方式:@Pointcut("pointCut()")

声明

    @Pointcut("execution(* com.tian.spring.aop.annotation.CalculatorImpl.*(..))")
    public void pointCut() {
    }

引用

    @After("pointCut()")
    public void afterAdviceMethod() {
    }

到此这篇关于浅析Spring基于注解的AOP的文章就介绍到这了,更多相关Spring AOP内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java SpringAOP技术之注解方式详解

    目录 1.配置xml扫描注解 2.配置注解 3.配置文件中开启自动代理 4.通知类型注解 5.测试类 6.结果 总结 1.配置xml扫描注解 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchem

  • SpringBoot自定义注解之实现AOP切面日志详解

    通过自定义注解的方式(如:@SysLog(obj = "操作对象", text = "操作内容"),在 SpringBoot 中来实现 AOP 切面统一打印出入参日志. 一.先看下项目结构 二.Maven JAR依赖 <!-- AOP -->     <dependency>             <groupId>org.springframework.boot</groupId>             <

  • SpringBoot通过AOP与注解实现入参校验详情

    目录 前言: 注解标记 通过AOP对方法进行增强 测试Get请求 测试POST请求 解决方法代码 再次测试POST请求 前言: 问题源头: 在日常的开发中,在Service层经常会用到对某一些必填参数进行是否存在的校验.比如我在写一个项目管理系统: 这种必填参数少一些还好,如果多一些的话光是if语句就要写一堆.像我这种有代码洁癖的人看着这一堆无用代码更是难受. 如何解决: 在Spring里面有一个非常好用的东西可以对方法进行增强,那就是AOP.AOP可以对方法进行增强,比如:我要校验参数是否存在

  • Spring AOP结合注解实现接口层操作日志记录

    目录 1.表和实体设计 1.实体设计 2.表结构设计 2.日志注解 3.核心AOP类 4.用到的工具类 5.测试类 6.测试结果 1.表和实体设计 1.实体设计 实体基类 @Data //映射将仅应用于其子类 @MappedSuperclass //指定要用于实体或映射超类的回调侦听器类.此注释可以应用于实体类或映射的超类. @EntityListeners(AuditingEntityListener.class) public class BaseEntity implements Seri

  • Spring AOP如何在注解上使用SPEL表达式注入对象

    目录 在注解上使用SPEL表达式注入对象 场景描述 具体案例 补充 Spring属性注入方式之SPEL表达式 在注解上使用SPEL表达式注入对象 场景描述 在平时开发中,我们经常通过定义一些注解,进行轻量级开发. 今天主要研究的内容是关于如何在注解上通过spel表达式注入对象,以此调用注入对象的具体业务处理逻辑,然后在通过对表达式的解析,进而获取该业务逻辑处理的结果,类似于Spring Security中的@PreAuthorize, @PreAuthorize, @PostAuthorize等

  • SpringBoot中利用AOP和拦截器实现自定义注解

    目录 前言 Spring实现自定义注解 1.引入相关依赖 2.相关类 Java实现自定义注解 通过Cglib实现 通过JDk动态代理实现 Cglib和JDK动态代理的区别 写在最后 前言 最近遇到了这样一个工作场景,需要写一批dubbo接口,再将dubbo接口注册到网关中,但是当dubbo接口异常的时候会给前端返回非常不友好的异常.所以就想要对异常进行统一捕获处理,但是对于这种service接口使用@ExceptionHandler注解进行异常捕获也是捕获不到的,应为他不是Controller的

  • Spring Aop常见注解与执行顺序详解

    目录 Spring Aop 的常用注解 常见问题 示例代码 配置文件 接口类 实现类 aop 拦截器 测试类 执行结论 多切面的情况 代理失效场景 总结 Spring 一开始最强大的就是 IOC / AOP 两大核心功能,我们今天一起来学习一下 Spring AOP 常见注解和执行顺序. Spring Aop 的常用注解 首先我们一起来回顾一下 Spring Aop 中常用的几个注解: @Before 前置通知:目标方法之前执行 @After 后置通知:目标方法之后执行(始终执行) @After

  • 浅析Spring基于注解的AOP

    目录 一.准备工作 二.基于注解的AOP之前置通知 三.基于注解的AOP之切入点表达式的语法和重用以及获取连接点的信息 ①切入点表达式的语法 ②获取连接点的信息 ③重用写入点表达式 一.准备工作 ①创建一个Maven工程 ②添加依赖 在IOC所需依赖基础上再加入下面依赖即可: <!-- spring-aspects会帮我们传递过来aspectjweaver --> <dependency> <groupId>org.springframework</groupId

  • Spring框架基于注解的AOP之各种通知的使用与环绕通知实现详解

    目录 一.基于注解的AOP之各种通知的使用 二.基于注解的AOP之环绕通知 一.基于注解的AOP之各种通知的使用 1.在切面中,需要通过指定的注解将方法标识为通知方法 @Before:前置通知,在目标对象方法执行之前执行 @After:后置通知,在目标对象方法的finally子句中执行 @AfterReturning:返回通知,在目标对象方法返回值之后执行 @AfterThrowing:异常通知,在目标对象方法的catch子句中执行 声明重用写入点表达式 @Pointcut("execution

  • Spring基于注解整合Redis完整实例

    在<Redis之--Spring整合Redis>一文中,向大家介绍了如何将spring与Redis整合起来,但不是基于注解的形式,很多同学都希望能够通过注解的形式来简单的将Spring与Redis整合起来,这样,在使用的时候,只需要在相应的方法上加上注解,便可以使方法轻松的调用Redis的缓存.那么今天就来向大家介绍如何用基于注解的形式来整合Spring与Redis. 一.项目搭建 今天,我们不使用hibernate来操作数据库了,我们今天选择的框架是: Spring4(包括mvc.conte

  • Spring基于AspectJ的AOP开发案例解析

    目录 AspectJ简介 注解开发 环境准备 不同的通知类型 最通知中通过value属性定义切点 入门案列 @Before前置通知 @AfterReturning后置通知 @Around环绕通知 @AfterThrowing 异常抛出通知 @After 最终通知 通过@Pointcut为切点命名 AspectJ的XML方式的AOP开发 使用AspectJ实现AOP 注解方式 XML方式 AspectJ简介 AspectJ是一个基于Java语言的AOP框架 Spring2.0以后新增了对Aspec

  • spring 重复注解和aop拦截的实现示例

    前言: 1:jdk1.8开始支持重复注解@Repeatable实现 2:aop拦截需要拦截当前注解和@Repeatable指向的包装注解才可以完全拦截到,因为:1.当在在方法上只有一个注解时,aop拦截认为是非包装类型注解.2.当方法上有多个重复注解时,aop拦截认为是包装类型注解. 重复注解实现方式(RequestLimit为原始注解,RequestLimitPack为包装注解): import java.lang.annotation.ElementType; import java.lan

  • Spring基于注解的缓存声明深入探究

    目录 一.概述 二.声明式基于注解的缓存 1.@Cacheable注解 (1) 默认缓存key的生成 (2) 声明式自定义key生成 (3) 默认缓存解析 (4) 自定义缓存解析 (5) 条件式缓存 2.@CachePut注解 3.@CacheEvict注解 4.@Caching注解 5.@CacheConfig注解 三.开启声明式缓存注解 四.使用自定义注解 一.概述 从3.1版本起,Spring框架就已经支持将缓存添加到现有的Spring应用中,和事务支持一样,缓存抽象允许在对代码影响最小的

  • Spring基于注解配置事务的属性

    本文实例为大家分享了Spring基于注解配置事务的属性,供大家参考,具体内容如下 一.事务属性概述 在Spring中,事务属性描述了事务策略如何应用到方法上,事务属性包含5个方面: ① 传播行为② 隔离级别③ 回滚策略④ 超时时间⑤ 是否只读 二.事务的传播行为属性## 1.当事务方法被另一个事务方法调用时,必须指定事务应该如何传播.例如,方法可能继续在现有的事务中允许,也可能开启一个新事务,并在自己的事务中运行.2.事务的传播行为可以由传播属性指定,Spring定义了7种类型的传播行为.其中最

  • spring基于注解配置实现事务控制操作

    目录 spring注解配置实现事务控制 1.导入相关依赖 2.创建spring配置类 3.创建JdbcConfig数据源配置类 4.创建TransactionConfig事务配置类 5.创建jdbcConfig.properties 6.使用事务注解 Spring注解方式的事务实现机制 1.事务的实现机制 AOP动态代理进行方法拦截 事务管理器进行事务提交或回滚 2.注解方式的事务使用注意事项 正确的设置 @Transactional 的 propagation 属性(熟知事务的传播特性) 正确

  • 基于spring@aspect注解的aop实现过程代码实例

    @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格.通过在你的基于架构的 XML 配置文件中包含以下元素,@AspectJ 支持是可用的. 第一步:编写切面类 package com.dascom.hawk.app.web.tool; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.l

  • 带你了解如何使用Spring基于ProxyFactoryBean创建AOP代理

    目录 1 基础 2 JavaBean属性 3 JDK和CGLIB代理 总结 若使用 Spring IoC 容器(ApplicationContext或BeanFactory)作为你的业务对象(你也应该这么做!),你会想使用 Spring AOP FactoryBean的一种. 工厂 bean 引入了中间层,让它创建不同类型的对象. 在Spring创建 AOP 代理的基本方式是使用 org.springframework.aop.framework.ProxyFactoryBean.这可以完全控制

随机推荐