Spring注解驱动之AOP功能测试

前言

Spring的AOP指的是在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式【动态代理】。

AOP功能测试

①导入AOP模块

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.12.RELEASE</version>
    </dependency>

②定义逻辑组件和切面类

逻辑组件

在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)

public class MathCalculator {

  public int div(int i,int j){
    System.out.println("MathCalculator...div...");
    return i/j;
  }

}

切面类

切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;

/**
 * 切面类  必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect)
 * @Aspect: 告诉Spring当前类是一个切面类
 *
 */
@Aspect
public class LogAspects {

  //抽取公共的切入点表达式
  //1、本类引用 pointCut()
  //2、其他的切面引用 com.atneusoft.springboot.aop.LogAspects.pointCut()
  @Pointcut("execution(public int com.atneusoft.springboot.aop.MathCalculator.*(..))")
  public void pointCut(){};

  //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
  //给切面类的目标方法标注何时何地运行(通知注解@Before\@After\@AfterReturning\@AfterThrowing)  //前置通知(@Before):在目标方法(div)运行之前运行
  @Before("pointCut()")
  public void logStart(JoinPoint joinPoint){
    Object[] args = joinPoint.getArgs();
    System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");
  }
    //后置通知(@After):在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
  @After("com.atneusoft.springboot.aop.LogAspects.pointCut()")
  public void logEnd(JoinPoint joinPoint){
    System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");
  }

  //JoinPoint一定要出现在参数表的第一位  //返回通知(@AfterReturning):在目标方法(div)正常返回之后运行
  @AfterReturning(value="pointCut()",returning="result")
  public void logReturn(JoinPoint joinPoint,Object result){
    System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");
  }
  //异常通知(@AfterThrowing):在目标方法(div)出现异常以后运行
  @AfterThrowing(value="pointCut()",throwing="exception")
  public void logException(JoinPoint joinPoint,Exception exception){
    System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");
  }

}

③将切面类和业务逻辑类(目标方法所在类)都加入到容器中,给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式,与配置文件的以下形式相同

<!-- 开启基于注解版的切面功能 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>

@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {

  //业务逻辑类加入容器中
  @Bean
  public MathCalculator calculator(){
    return new MathCalculator();
  }

  //切面类加入到容器中
  @Bean
  public LogAspects logAspects(){
    return new LogAspects();
  }
}
@Test
  public void test01(){
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);

    //1、不要自己创建对象
//    MathCalculator mathCalculator = new MathCalculator();
//    mathCalculator.div(1, 1);
    MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class);

    mathCalculator.div(1, 0);

    applicationContext.close();
  }
07:49:45.185 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'mathCalculator'
div运行。。。@Before:参数列表是:{[1, 1]}
MathCalculator...div...
div结束。。。@After
div正常返回。。。@AfterReturning:运行结果:{1}
com.atneusoft.springboot.aop.MathCalculator@5965be2d

总结

三步:

1)、将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect)

2)、在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式)

3)、开启基于注解的aop模式;@EnableAspectJAutoProxy

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Spring AOP注解失效的坑及JDK动态代理

    @Transactional @Async等注解不起作用 之前很多人在使用Spring中的@Transactional, @Async等注解时,都多少碰到过注解不起作用的情况. 为什么会出现这些情况呢?因为这些注解的功能实际上都是Spring AOP实现的,而其实现原理是通过代理实现的. JDK动态代理 以一个简单的例子理解一下JDK动态代理的基本原理: //目标类接口 public interface JDKProxyTestService { void run(); } //目标类 publ

  • 详解使用Spring AOP和自定义注解进行参数检查

    引言 使用SpringMVC作为Controller层进行Web开发时,经常会需要对Controller中的方法进行参数检查.本来SpringMVC自带@Valid和@Validated两个注解可用来检查参数,但只能检查参数是bean的情况,对于参数是String或者Long类型的就不适用了,而且有时候这两个注解又突然失效了(没有仔细去调查过原因),对此,可以利用Spring的AOP和自定义注解,自己写一个参数校验的功能. 代码示例 注意:本节代码只是一个演示,给出一个可行的思路,并非完整的解决

  • Spring Boot 通过AOP和自定义注解实现权限控制的方法

    本文介绍了Spring Boot 通过AOP和自定义注解实现权限控制,分享给大家,具体如下: 源码:https://github.com/yulc-coding/java-note/tree/master/aop 思路 自定义权限注解 在需要验证的接口上加上注解,并设置具体权限值 数据库权限表中加入对应接口需要的权限 用户登录时,获取当前用户的所有权限列表放入Redis缓存中 定义AOP,将切入点设置为自定义的权限 AOP中获取接口注解的权限值,和Redis中的数据校验用户是否存在该权限,如果R

  • SpringBoot使用AOP+注解实现简单的权限验证的方法

    SpringAOP的介绍:传送门 demo介绍 主要通过自定义注解,使用SpringAOP的环绕通知拦截请求,判断该方法是否有自定义注解,然后判断该用户是否有该权限.这里做的比较简单,只有两个权限:一个普通用户.一个管理员. 项目搭建 这里是基于SpringBoot的,对于SpringBoot项目的搭建就不说了.在项目中添加AOP的依赖:<!--more---> <!--AOP包--> <dependency> <groupId>org.springfram

  • 详解SpringBoot AOP 拦截器(Aspect注解方式)

    常用用于实现拦截的有:Filter.HandlerInterceptor.MethodInterceptor 第一种Filter属于Servlet提供的,后两者是spring提供的,HandlerInterceptor属于Spring MVC项目提供的,用来拦截请求,在MethodInterceptor之前执行. 实现一个HandlerInterceptor可以实现接口HandlerInterceptor,也可以继承HandlerInterceptorAdapter类,两种方法一样.这个不在本文

  • Spring Boot之AOP配自定义注解的最佳实践过程

    前言 AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面.通知和切入点这些让人头皮发麻的概念. 今天就来说说AOP的一些应用场景以及如何通过和其他特性的结合提升自己的灵活性.下面话不多说了,来一起看看详细的介绍吧 AOP应用举例 AOP的一大好处就是解耦.通过切面,我们可以将那些反复出现的代码抽取出来,放在一个地方统一处理. 同时,抽出来的代码很多是

  • spring aop注解配置代码实例

    本文实例为大家分享了spring aop注解配置的具体代码,供大家参考,具体内容如下 Demo.java package cn.itcast.e_annotation; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.ApplicationContext; import org.springfra

  • Spring AOP + 注解实现统一注解功能

    1. 概述 在一般系统中,当我们做了一些重要的操作时,如登陆系统,添加用户,删除用户等操作时,我们需要将这些行为持久化.本文我们通过Spring AOP和Java的自定义注解来实现日志的插入.此方案对原有业务入侵较低,实现较灵活 2. 日志的相关类定义 我们将日志抽象为以下两个类:功能模块和操作类型 使用枚举类定义功能模块类型ModuleType,如学生.用户模块 public enum ModuleType { DEFAULT("1"), // 默认值 STUDENT("2

  • Spring注解驱动之AOP功能测试

    前言 Spring的AOP指的是在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式[动态代理]. AOP功能测试 ①导入AOP模块 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.3.12.RELEASE</version> </depend

  • 详解Spring注解驱动开发之属性赋值

    一.@Value注解 在Person的属性上使用@Value注解指定注入值 public class Person { @Value("#{20-2}") //SpEL表达式 #{} private Integer id; @Value("张三") //基本数据类型 private String name; } 配置类 @Configuration public class MainConfigOfPropertyValues { @Bean public Pers

  • Spring注解驱动之ApplicationListener异步处理事件说明

    目录 概述 示例 自定义事件多波器 测试用例 ApplicationListener异步执行源码分析 概述 之前我们讲过简单使用ApplicationListener发布事件,处理事件,但是发现是同一个线程发送事件并自己处理事件的. 下面我们就来说下如何使用自定义的线程池来异步处理接收的事件. 示例 实现一个ApplicationListener用于处理事件 package com.atguigu.ext; import org.springframework.context.Applicati

  • Spring注解驱动开发实现属性赋值

    前言 在实际开发当中,Spring中bean的属性直接赋值用的不是太多,整理这方面的资料,做一个小结,以备后续更深入的学习. 通过配置文件的方式 以配置文件的方式启动spring容器时,可以使用property标签的value给bean的属性赋值,赋值的形式有以下几种: <--通过context:property-placeholder将properties文件中的值加载的环境变量中(properties中的属性值最终是以环境变量的形式存储的)> <context:property-pl

  • Spring注解驱动扩展原理BeanFactoryPostProcessor

    1.扩展原理-BeanFactoryPostProcessor BeanFactoryPostProcessor * 扩展原理: * BeanPostProcessor:bean后置处理器,bean创建对象初始化前后进行拦截工作的 * * 1.BeanFactoryPostProcessor:beanFactory的后置处理器: * 在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容: * 所有的bean定义已经保存加载到beanFactory,但是bean的实

  • Spring注解驱动之ApplicationListener用法解读

    目录 ApplicationListener概述 ApplicationListener作用 ApplicationListener用法 ApplicationListener概述 ApplicationListener按照字面意思,它应该是Spring里面的应用监听器,也就是Spring为我们提供的基于事件驱动开发的功能. 也就是说我们只要写一个监听器来实现ApplicationListener接口,该接口中泛型就是我们要监听的事件,那么如果我们发布对应的事件,就能在实现的监听器里面处理. A

  • Spring注解驱动之BeanDefinitionRegistryPostProcessor原理解析

    目录 BeanDefinitionRegistryPostProcessor概述 案例实践 源码分析 小结 BeanDefinitionRegistryPostProcessor概述 可以看到BeanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口. 注释中说执行时机是所有合法的bean定义已经加载,但是还没实例化. 看起来和BeanFactoryPostProcessor执行时机差不多,但是BeanFactoryPostP

  • Spring学习通过AspectJ注解方式实现AOP操作

    目录 Spring注解AspectJ操作AOP 一.被增强类 二.增强类 三.进行通知的配置 1. spring 配置文件中,开启扫描. 2. 使用注解创建 User 和 UserProxy 对象 3. 在增强类上使用注解 @Aspect 4. spring配置,开启生成代理对象 5. 配置不同类型的通知 四.抽取相同切入点 五.多个增强类的优先级 Spring注解AspectJ操作AOP 一.被增强类 新建一个被增强的类 User,下面有个 add() 方法. package com.ping

  • 使用Spring的注解方式实现AOP实例

    spring对AOP的实现提供了很好的支持.下面我们就使用Spring的注解来完成AOP做一个例子. 首先,为了使用Spring的AOP注解功能,必须导入如下几个包.aspectjrt.jar,aspectjweaver.jar,cglib-nodep.jar.然后我们写一个接口 package com.bird.service; public interface PersonServer { public void save(String name); public void update(S

  • Spring使用AspectJ的注解式实现AOP面向切面编程

    1.认识Spring AOP 1.1 AOP的简介 AOP:面向切面编程,相对于OOP面向对象编程. Spring的AOP的存在目的是为了解耦.AOP可以让一组类共享相同的行为.在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,而且类的继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足. 1.2 AOP中的概念 切入点(pointcut): 切入点(pointcut):在哪些类.哪些方法上切入. 通知(advice):在方法前.方法后.方法前后做什么. 切面(aspe

随机推荐