首页 > 编程知识 正文

springboot(java aop应用场景)

时间:2023-05-05 11:04:07 阅读:85510 作者:4467

一、为什么需要面向切面编程?

面向对象编程(OOP )的优点很明显,缺点也同样很明显。 如果需要向不具有继承关系的多个对象(如日志记录、性能监视等)添加共同的方法,则需要向各个对象添加相同的方法,从而导致工作量和代码的重复,不利于维护面向切片编程(AOP )是面向对象编程的补充,简单地说,是统一处理某个“切片”问题的编程思想。 通过AOP方式记录和处理日志,可以将所有的日志代码集中在一个地方,不需要按方法添加,从而大幅减少重复代码。

二、Spring AOP术语

通知(Advice )包含必须用于多个APP对象的横向行为。 完全听不懂。 没关系。 通俗地说,定义了“什么时候”和“做什么”。

“连接点”是程序运行时可以应用通知的所有点。

所谓“点切割”,是指定义在“何处”进行切入、通知哪个连接点。 很明显接点一定是连接点。

切断面(Aspect )是通知和切断点的组合。 通知和接点定义切面的所有内容——是什么、何时何地完成功能。

使用“引入”(Introduction ),可以将新方法或属性添加到现有类中。

织入(Weaving )是将切片应用于目标对象并创建新代理对象的过程,分为编译时织入、类加载时织入和运行时织入。

要使用

三、Spring Boot AOP实战

3.1 引入依赖

springbootAOP,必须添加spring-boot-starter-aop依赖关系,如下所示:

从属关系

groupid org.spring框架. boot/groupid

artifactidspring -启动-启动-航空/航空id

/dependency不需要添加外观浏览器的依赖关系。 由于spring-boot-starter-aop包含aspectjweaver,且该版本是新版本,因此添加旧版本(如1.5.4 )将在启动时报告错误。

3.2 编写用于拦截的bean

直接定义控制器。 代码如下所示。

@ rest控制器

公共类自动控制器{2}

@requestmapping((/Hello ) ) ) ) ) ) ) ) ) ) )。

公共字符串天() {

system.out.println (帮助);

返回问候;

}

}

3.3 定义切面

Spring使用@AspectJ注释对POJO进行注释。 这表明该类不仅仅是一个POJO,而是一个切面。 由于是切割面和通知的组合,因此必须创建切割点和通知才能定义切割面。 只需在代码中添加@Aspect注释。

3.3.1 定义切点

接点由@Pointcut注释和接点公式定义。

@Pointcut注释可以定义切片内可重复使用的接点。

Spring切片的粒度达到方法级别最小,而execution表达式可以用于明确指定方法相关的部件,如方法返回类型、类名、方法名、参数名等,实际上大部分都需要使用AO

P的业务场景也只需要达到方法级别即可,因而execution表达式的使用是最为广泛的。如图是execution表达式的语法:

execution表示在方法执行的时候触发。以“”开头,表明方法返回值类型为任意类型。然后是全限定的类名和方法名,“”可以表示任意类和任意方法。对于方法参数列表,可以使用“..”表示参数为任意类型。如果需要多个表达式,可以使用“&&”、“||”和“!”完成与、或、非的操作。

3.3.2 定义通知

通知有五种类型,分别是:

前置通知(@Before):在目标方法调用之前调用通知

后置通知(@After):在目标方法完成之后调用通知

环绕通知(@Around):在被通知的方法调用之前和调用之后执行自定义的方法

返回通知(@AfterReturning):在目标方法成功执行之后调用通知

异常通知(@AfterThrowing):在目标方法抛出异常之后调用通知

代码中定义了三种类型的通知,使用@Before注解标识前置通知,打印“beforeAdvice...”,使用@After注解标识后置通知,打印“AfterAdvice...”,使用@Around注解标识环绕通知,在方法执行前和执行之后分别打印“before”和“after”。这样一个切面就定义好了,代码如下:

@Aspect @Component public class AopAdvice { @Pointcut("execution (* com.shangguan.aop.controller.*.*(..))") public void test() { } @Before("test()") public void beforeAdvice() { System.out.println("beforeAdvice..."); } @After("test()") public void afterAdvice() { System.out.println("afterAdvice..."); } @Around("test()") public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) { System.out.println("before"); try { proceedingJoinPoint.proceed(); } catch (Throwable t) { t.printStackTrace(); } System.out.println("after"); } }

3.4 启动测试

完成之后的代码结构如图所示:

运行AopApplication,在浏览器访问http://localhost:8080/hello,不出意外,控制台输出如图所示:

作者:James_Shangguan

原文链接:https://www.cnblogs.com/sgh1023/p/13363679.html

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。