探秘SpringAop(一)_介绍以及使用详解

简介: 常用的编程范式AOP 是什么是一种编程方式,不是编程语言解决特定问题,不能解决所有的问题OOP的补充,不是代替AOP 初衷DRY: Don't repeat yourself(代码重复)SoC:Separation of Concerns(关注点分离)水平分离:展示层-> ...

常用的编程范式

img_6caaaf01c8705e3bf91d85ec7b448856.png

AOP 是什么

  • 是一种编程方式,不是编程语言
  • 解决特定问题,不能解决所有的问题
  • OOP的补充,不是代替

AOP 初衷

  • DRY: Don't repeat yourself(代码重复)
  • SoC:Separation of Concerns(关注点分离)
    • 水平分离:展示层-> 服务层 -> 持久层
    • 垂直分离:模块划分(订单、库存等)
    • 切面分离:分离功能性需求与非功能性需求

AOP的优点

  • 集中处理某一关注点/横切逻辑
  • 可以很方便地添加/删除关注点
  • 侵入性少,增强代码可读性及可维护性

AOP的应用场景

  • 权限控制
  • 缓存控制
  • 性能监控
  • ...

支持AOP的语言

  • Java、Python、PHP...

SpringAOP使用详解

首先,我整理了一张图,让大家更好的梳理SpringAOP的使用

img_9b5b311ca9bfe8a660349c709123c209.png

@Poincut 详解

匹配包/类型_ within()
  • 匹配ProductService类里头的所有方法
  • @Pointcut("within(com.zhb.service.ProductService)")

  • 匹配com.zhb包及子包下所有类的方法
  • @Pointcut("within(com.zhb..*)")

匹配对象
  • 匹配AOP对象的目标对象为指定类型的方法,即LogService的aop代理对象的方法
  • @Pointcut("this(com.zhb.log.Loggable)")

  • 匹配实现Loggable接口的目标对象(而不是aop代理后的对象)的方法
  • @Pointcut("target(com.zhb.log.Loggable)")

  • this 可以拦截 DeclareParents(Introduction)
  • target 不拦截 DeclareParents(Introduction)
  • 匹配所有以Service结尾的bean里头的方法
  • @Pointcut("bean(*Service)")

匹配参数 args()
  • 匹配任何以find开头而且只有一个Long参数的方法
  • @Pointcut("execution(* ..find(Long))")

  • 匹配任何以find开头的而且第一个参数为Long型的方法
  • @Pointcut("execution(* ..find(Long,..))")

  • 匹配任何只有一个Long参数的方法
  • @Pointcut("within(com.zhb..*) && args(Long)")

  • 匹配第一个参数为Long型的方法
  • @Pointcut("within(com.zhb..*) && args(Long,..)")

匹配注解
  • 匹配方法标注有AdminOnly的注解的方法
  • @Pointcut("@annotation(com.zhb.anno.AdminOnly) && within(com.zhb..*)")
  • 匹配标注有NeedSecured的类底下的方法 //class级别
  • @Pointcut("@within(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
  • 匹配标注有NeedSecured的类及其子类的方法 //runtime级别
  • 在spring context的环境下,二者没有区别
  • @Pointcut("@target(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
  • 匹配传入的参数类标注有Repository注解的方法
  • @Pointcut("@args(com.zhb.anno.NeedSecured) && within(com.zhb..*)")
匹配方法
  • 匹配任何公共方法
  • @Pointcut("execution(public * com.zhb.service..(..))")

  • 匹配com.zhb包及子包下Service类中无参方法
  • @Pointcut("execution(* com.zhb..Service.())")

  • 匹配com.zhb包及子包下Service类中的任何只有一个参数的方法
  • @Pointcut("execution(* com.zhb..Service.(*))")

  • 匹配com.zhb包及子包下任何类的任何方法
  • @Pointcut("execution(* com.zhb...(..))")

  • 匹配com.zhb包及子包下返回值为String的任何方法
  • @Pointcut("execution(String com.zhb...(..))")

  • 匹配异常
  • execution(public * com.zhb.service..(..) throws java.lang.IllegalAccessException)

其实,这么多实际工作中用到的比较少,我平时就用过execution 这一个。

Advice 详解

  • @Before(value = "matchLongArg() && args(productId)")
  • public void beforeWithArgs(Long productId)
  • @AfterReturning(value = "matchReturn()",returning = "returnValue")
  • public void getReulst(Object returnValue)

给出一段常用代码


    @Pointcut("within(com.zhb.controller.GirlController)")
    public void mathType(){}

    @Before(value = "mathType() && args(obj)")
    public void before(Object obj){

        System.out.println("这里是目标方法执行前先执行");
        //获取参数
        System.out.println("这里是目标方法的参数"+obj.toString());
    }
    @AfterReturning(returning = "entity",value = "mathType()")
    public void after(JoinPoint joinPoint,Object entity){
        System.out.println("这里是目标方法执行完并成功返回结果 正常结束后才执行");
        System.out.println("方法的返回结果为"+entity);
        System.out.println("目标方法内的参数为"+ Arrays.asList(joinPoint.getArgs()));
    }
    @AfterThrowing(throwing = "e",value = "mathType()")
    public void mathThrow(Throwable  e){
        System.out.println("这里是目标方法抛出异常后才执行");
        System.out.println("异常信息为"+e);
    }

大家再用到的时候可以自行搜索

学习不是要么0分,要么100分的。80分是收获;60分是收获;20分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的0分了。
相关文章
|
5月前
|
Java Spring Apache
Spring Boot邂逅Apache Wicket:一次意想不到的完美邂逅,竟让Web开发变得如此简单?
【8月更文挑战第31天】Apache Wicket与Spring Boot的集成提供了近乎无缝的开发体验。Wicket以其简洁的API和强大的组件化设计著称,而Spring Boot则以开箱即用的便捷性赢得开发者青睐。本文将指导你如何在Spring Boot项目中引入Wicket,通过简单的步骤完成集成配置。首先,创建一个新的Spring Boot项目并在`pom.xml`中添加Wicket相关依赖。
143 0
|
8月前
|
Java
SpringAop切面编程(一看就会用)
SpringAop切面编程(一看就会用)
30 0
|
Java 程序员 网络安全
jackson学习之五:JsonInclude注解
JsonInclude注解重点说明
203 2
jackson学习之五:JsonInclude注解
|
设计模式 算法 Java
Sprin框架的学习(课时七)SpringAop的学习(一)
Sprin框架的学习(课时七)SpringAop的学习(一)
82 0
|
XML 缓存 安全
Sprin框架的学习(课时七)SpringAop的学习(二)
Sprin框架的学习(课时七)SpringAop的学习(二)
57 0
|
Java
SpringAop学习(二)
SpringAop学习(二)
116 1
SpringAop学习(二)
|
缓存 监控 Java
SpringAop学习(一)
SpringAop学习(一)
94 0
SpringAop学习(一)
|
Java Spring 容器
BeanFactoryPostProcessor--- Spring源码从入门到精通(二十七)
BeanFactoryPostProcessor--- Spring源码从入门到精通(二十七)
BeanFactoryPostProcessor--- Spring源码从入门到精通(二十七)
|
Java 容器 Spring
ApplicationListener--- Spring源码从入门到精通(二十九)
ApplicationListener--- Spring源码从入门到精通(二十九)
ApplicationListener--- Spring源码从入门到精通(二十九)
|
Java Spring 容器
@EventListener--- Spring源码从入门到精通(三十)
@EventListener--- Spring源码从入门到精通(三十)
@EventListener--- Spring源码从入门到精通(三十)

热门文章

最新文章

下一篇
开通oss服务