AOP的使用

AOP的使用,第1张

AOP的使用 首先先来介绍一下什么是AOP?

AOP是面向切面的编程思想:
将业务逻辑模块中,需要进性处理的功能点,从逻辑上的角度将其作为一个整体进性管理;这个整体,就可以看做是有这些不同模块中的逻辑点构成的一个面;这个面就是切面;
连接点(Joinpoint):进性切面业务处理时的时机点,例如方法执行前、方法执行后、抛出异常等时机点;
增强(Advice):添加特定连接点上的一段业务逻辑处理代码;也就是在连接点上执行的业务处理过程;
就是在特定连接点上触发的一组动作;
切入点(PointCut):被增强的连接点就是切入点; 添加了增强功能的连接点;
织入(Weaving):将增强添加到目标对象的具体的连接点的过程。也就是将增强和连接点结合的过程就是织入;
切面(Aspect):切面由切入点和增强构成。切面就是切入点的集合;AOP就是通过切面来管理连接点和增强的;

目标对象(Target):需要添加增强的目标类。(被代理的目标类)
代理(Proxy):目标对象通过AOP生成的代理对象;代理和目标对象之间是代理和被代理的关系;

引入(Introduction):是一种特殊的增强;可以为目标对象添加一些属性和方法;一般用作动态的给目标对象附加一些行为能力

AOP包含有注解和切入点表达式两种方式 :

1.@Aspect注解,只能引入AspectJ相关的 jar 包:

aopalliance-1.0.jar 和 aspectjweaver.jar

 

 2.切点表达式

 1.execution

 由于Spring切面粒度最小是达到方法级别,而execution表达式可以用于明确指定方法返回类型,类名,方法名和参数名等与方法相关的部件,并且在Spring中,大部分需要使用AOP的业务场景也只需要达到方法级别即可,因而execution表达式的使用是最为广泛的。如下是execution表达式的语法

2.within

3.args

4.this和target

this和target需要放在一起进行讲解,主要目的是对其进行区别。this和target表达式中都只能指定类或者接口,在面向切面编程规范中,this表示匹配调用当前切点表达式所指代对象方法的对象,target表示匹配切点表达式指定类型的对象。比如有两个类A和B,并且A调用了B的某个方法,如果切点表达式为this(B),那么A的实例将会被匹配,也即其会被使用当前切点表达式的Advice环绕;如果这里切点表达式为target(B),那么B的实例也即被匹配,其将会被使用当前切点表达式的Advice环绕。

示例实现一个功能:controller层所有方法,入参和出参的自动打印

实现步骤

日志打印 pom.xml 依赖

4.3.12.RELEASE

2.9.1

1.8.9

1.2.2

1.16.18

spring-mvc.xml 添加 aop 自动代理 

新建注解 LogPrint,将注解作为切点,作用到 Controller 的方法

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface LogPrint {
    String description() default "";
}

新建切面 LogPrintAspect,在 controller 方法调用前,调用后打印入参,出参

@Aspect
@Component
@Slf4j
public class LogPrintAspect {
    // 1,声明切点
    @Pointcut("@annotation(cn.exrick.common.annotaion.LogPrint)")
    public void logPrint(){}
    // 2,打印入参 joinPoint.getArgs() -- 获取入参
    @Before("logPrint()")
    public void doBefore(JoinPoint joinPoint){
    // 3, 打印出参 proceedingJoinPoint.proceeding() -- 执行切点修饰的方法,拿到结果,打印响应
    @Around("logPrint()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {}
	// 4,切点作用的方法结束
    @After("logPrint()")
    public void doAfter(){}
}

使用注解 @LogPrint 修饰 Controller 类中的方法

@RestController
public class LogController {
    @LogPrint
    @RequestMapping("/logGet")
    public Object getTest(String name, String age){
        String content = name + "今年" + age + "岁";
        HashMap resultMap = new HashMap<>();
        resultMap.put("content", content);
        return resultMap;
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5671944.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存