Spring boot 入门教程-AOP详细介绍及使用_springboot的aop-程序员宅基地

技术标签: spring Boot系列  

AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待。

一 AOP的基本概念

(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知

(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用

(3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around

(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式

(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

二 Spring AOP

Spring中的AOP代理还是离不开Spring的IOC容器,代理的生成,管理及其依赖关系都是由IOC容器负责,Spring默认使用JDK动态代理,在需要代理类而不是代理接口的时候,Spring会自动切换为使用CGLIB代理,不过现在的项目都是面向接口编程,所以JDK动态代理相对来说用的还是多一些。

三 基于注解的AOP配置方式

1.启用@AsjectJ支持

在applicationContext.xml中配置下面一句:

<aop:aspectj-autoproxy />

2.通知类型介绍

(1)Before:在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可

(2)AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值

(3)AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名

来访问目标方法中所抛出的异常对象

(4)After:在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式

(5)Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

3.spring boot 中使用AOP

(1)依赖


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

(2)切面

@Component
@Aspect
public class Operator {
    
    @Pointcut("execution(* com.aijava.springcode.service..*.*(..))")
    public void pointCut(){}
    
    @Before("pointCut()")
    public void doBefore(JoinPoint joinPoint){
        System.out.println("AOP Before Advice...");
    }
    
    @After("pointCut()")
    public void doAfter(JoinPoint joinPoint){
        System.out.println("AOP After Advice...");
    }
    
    @AfterReturning(pointcut="pointCut()",returning="returnVal")
    public void afterReturn(JoinPoint joinPoint,Object returnVal){
        System.out.println("AOP AfterReturning Advice:" + returnVal);
    }
    
    @AfterThrowing(pointcut="pointCut()",throwing="error")
    public void afterThrowing(JoinPoint joinPoint,Throwable error){
        System.out.println("AOP AfterThrowing Advice..." + error);
        System.out.println("AfterThrowing...");
    }
    
    @Around("pointCut()")
    public void around(ProceedingJoinPoint pjp){
        System.out.println("AOP Aronud before...");
        try {
            pjp.proceed();
        } catch (Throwable e) {
            e.printStackTrace();
        }
        System.out.println("AOP Aronud after...");
    }
    
}

4.通知执行的优先级

进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After。

注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用!同时使用也没啥意义。

5.切入点的定义和表达式

切入点表达式的定义算是整个AOP中的核心,有一套自己的规范

Spring AOP支持的切入点指示符:

(1)execution:用来匹配执行方法的连接点

A:@Pointcut("execution(* com.aijava.springcode.service..*.*(..))")

第一个*表示匹配任意的方法返回值,..(两个点)表示零个或多个,上面的第一个..表示service包及其子包,第二个*表示所有类,第三个*表示所有方法,第二个..表示方法的任意参数个数

B:@Pointcut("within(com.aijava.springcode.service.*)")

within限定匹配方法的连接点,上面的就是表示匹配service包下的任意连接点

C:@Pointcut("this(com.aijava.springcode.service.UserService)")

this用来限定AOP代理必须是指定类型的实例,如上,指定了一个特定的实例,就是UserService

D:@Pointcut("bean(userService)")

bean也是非常常用的,bean可以指定IOC容器中的bean的名称

6.基于XML形式的配置方式

开发中如果选用XML配置方式,通常就是POJO+XML来开发AOP,大同小异,无非就是在XML文件中写切入点表达式和通知类型

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27828675/article/details/81217483

智能推荐

Cross-Browser Event Handlers_browsereventhandler.onbrowsercall-程序员宅基地

文章浏览阅读313次。Event are certain actions performed either by the users or by the browser itself , like click , load or mouseover . There are four event handlers in JavaScript : HTML event handler , DOM level 0 event_browsereventhandler.onbrowsercall

2021年下半年软件设计师上午真题答案及解析(三)_2021年下半年 软件设计师 语句覆盖测试用例-程序员宅基地

文章浏览阅读3.6k次,点赞10次,收藏15次。21、下图所示为一个非确定有限自动机(NFA),S0为初态,S3为终态。该NFA识别的字符串( )。A、不能包含连续的字符“0”B、不能包含连续的字符“1”C、必须以“101”开头D、必须以“101”结尾参考答案:D答案解析:22、在单处理机计算机系统中有1台打印机、1台扫描仪,系统采用先来先服务调度算法。假设系统中有进程P1、P2、P3、P4,其中P1为运行状态,P2为就绪状态,P3等待打印机,P4等待扫描仪。此时,若P1释放了扫描仪,则进程P1、P2、P3、P4的状态分别为( )。A、_2021年下半年 软件设计师 语句覆盖测试用例

C语言--螺旋矩阵--蛇形矩阵--数独_c语言经典题目螺旋矩阵-程序员宅基地

文章浏览阅读856次,点赞7次,收藏14次。题目:一、在n×n矩阵里填入1,2,3,…,n*n,要求:1.填成回形2.填成蛇形3.填写成将第1种顺时针旋转90度的回形矩阵例如n=4时的方阵如下图所示:1.常规回形矩阵#include <stdio.h>#include <stdlib.h>int main(void){ int n = 0, i = 0, j = 0; scanf("%d", &n); //输入行列数 //动态申请n行n列的二维数组,如果觉得麻烦根据题目要求申请足够大的也行_c语言经典题目螺旋矩阵

VUE使用 iframe 嵌入网页,浏览器报错 x-frame-options deny_vue x-frame-options-程序员宅基地

文章浏览阅读1.4w次,点赞2次,收藏4次。项目中用到iframe嵌入网页,然后用到springsecurity就被拦截了 浏览器报错Refused to display ‘网址' in a frame because it set 'X-Frame-Options' to 'deny'. 原因是因为springBoot springSecurty使用 X-Frame-Options防止网页被Frame 解决办法把..._vue x-frame-options

html css下拉菜单居中,css如何设置下拉菜单?-程序员宅基地

文章浏览阅读2.1k次。层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。CSS不仅可以静态地修饰网页,还可以配合各种脚本语言动态地对网页各元素进行格式化。CSS 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象和模型样式编辑的能力。使用css设置下拉..._css下拉菜单居中

可以就跟着这本书,完整做出一个STM32核心板,而且教你怎么SMT,那些基本概念都清楚了。_stm32h7 核心板 ad pcb 教程-程序员宅基地

文章浏览阅读382次。可以就跟着这本书,完整做出一个STM32核心板,而且教你怎么SMT经过前面看了比如 PCB入门的视频还有亲自问了商家怎么SMT之后,再看这本书就好得多。不会像刚开始一样,零基础的时候看,可能觉得是不是会有点复杂,现在看里面很多东西都是很熟悉的对吧。..._stm32h7 核心板 ad pcb 教程

随便推点

数据库的多表设计及复杂查询_复杂的数据库表设计-程序员宅基地

文章浏览阅读1.4k次。数据表与数据表之间关系三种:实体之间关系 多对多、一对多、一对一,接下来我们将从原理和对应的实例来学习以下: (一)多对多M:N 例子:项目与程序员 一个项目可以由多个程序员参与;一个程序员可以参与多个项目的开发建表原则联系的属性及两个实体的主标识形成关系表关系表的主键为两个实体主标识的组合雇员:(E1,E2); 项目:(P1,P2,P3); 参加表:(E1,P1,percent);_复杂的数据库表设计

隐私泄露中的人性剖析-程序员宅基地

文章浏览阅读295次。暂请点进来看的同学闲看故事二则。 故事一今天早上发生了一件尴尬的事情。我最好的闺蜜发来一条微信: 我的隐私泄露神经瞬间紧绷。每天沉浸在“大数据之下无隐私”的氛围和恐惧中,我怎么可能去做如此危险的操作!亲爱的,你找我真是找错人了。。。但是,人性是一种很悬的东西。有一种爱,叫作愿意为你放弃所有。不忍拒绝她的我,停顿5分钟后回复到:“要我这些信息的目的是什么?”...

Android基础_页面布局_碎片(Fragment)_android开发如何把fragment显示在页面上-程序员宅基地

文章浏览阅读3.7k次。有些布局可能在手机上看起来很漂亮,但是拿到屏幕比较大的横屏平板上面,有些控件可能会遭到拉伸,严重影响用户体验,作为一个合格的开发人员我们应该兼顾这两种情况,所以在Android3.0之后,Android引入了碎片的概念,它可以让界面更好的在平板上展示。在Android3.0之前的版本需要引入需要先导入android-support-v4的jar包才能使用Fragment功能。1.碎片是什么?_android开发如何把fragment显示在页面上

Python斗地主扑克牌游戏_poker = ['2 ', '2 ', '2 ', '2 ', '3 ', '3 ', '3 ',-程序员宅基地

文章浏览阅读573次。斗地主扑克牌游戏import randomclass PokerGame: def __init__(self): self.poker = ['2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', _poker = ['2 ', '2 ', '2 ', '2 ', '3 ', '3 ', '3 ', '3

设计模式之原型模式_struts2 原型模式-程序员宅基地

文章浏览阅读369次。一、引例原型模式是GoF23种设计模式的一种,属于创建型模式,用来解决复杂对象的创建问题。《西游记》中,孙悟空拔毛变小猴的故事几乎人人皆知,孙悟空可以用猴毛根据自己的形象,复制出很多个根自己长得一模一样的“身外身”来。我们在使用电脑的时候,对文件最常用的操作有两种,一种是复制,另一种是粘贴,这就是原型模式的应用。在软件系统中,有些对象的创建过程较为复杂,而且有时候需要频繁创建,原型模式通过给出一..._struts2 原型模式

一些重要的面试题!_error:(4, 12) java: -source 1.6 中不支持默认方法 (请使用 -sou-程序员宅基地

文章浏览阅读4.1k次。1.单例模式可能是代码最少的模式了,但是少不一定意味着简单,想要用好、用对单例模式,还真得费一番脑筋。本文对Java中常见的单例模式写法做了一个总结,如有错漏之处,恳请读者指正。饿汉法顾名思义,饿汉法就是在第一次引用该类的时候就创建对象实例,而不管实际是否需要创建。代码如下:1234567public class Singleton { private static Singleton..._error:(4, 12) java: -source 1.6 中不支持默认方法 (请使用 -source 8 或更高版