springAOP

功能:

1、每个业务方法调用的权限管理:在用户调用方法前判断用户是否有权调用此方法。

2、每个方法调用的审计:记录谁调用了什么业务方法,传入参数是什么,操作是否成功。

3、数据库事务的管理:在执行数据库一系列操作前,先开启事务,在执行完后提交事务;如果执行出错,则回滚事务。

4、缓存:对业务方法返回的数据进行缓存,下次调用的时候,如果参数未变,直接从缓存中获取数据,而不再调取应用方法。

术语介绍:

Aspect:Aspect声明类似于Java中的类声明,在Aspect中会包含一些Pointcut及相应的Advice。

Joint point:标识在程序中明确定义的点,典型的包括方法调用、对类成员的访问,以及异常处理程序块的执行等。Spring中的Joint point只支持方法调用。

Pointcut:表示一组Joint point,如方法名、参数类型、返回类型等,这些Joint point通过逻辑关系组合起来,它定义了相应的Advice将要发生的地方。简单理解Pointcut(一种表达式)--用来判断在Joint point(方法调用)中执行Advice(操作)。

 Advice:Advice定义了在Pointcut里面定义的程序点具体要做的操作,它通过before、around、after(return、throw、finally)来区别是在每个Joint point之前、之后还是执行前后要调用的代码。

  before:在执行方法前调用Advice,比如cache功能可以在执行方法前先判断是否有缓存。

  around:在执行方法前后调用Advice,这是Spring框架和应用系统一种最为常用的方法。

  after:在执行方法后调用Advice,after return是方法正常返回后调用,after throw是方法抛出异常后调用。

  finally:方法调用后执行Advice,无论是否抛出异常还是正常返回。

AOP proxy:AOP proxy也是Java对象,由AOP框架创建,用来完成上述的动作,AOP对象通常可以通过JDK dynamic proxy完成,或者使用CGLib完成。

Weaving:实现上述切面编程的代码织入,可以在编译时刻(AspectJ compiler),也可以在运行时刻,Spring和其他大多数Java框架都是在运行时刻生成代理。

例:

复制代码
package com.gcz.ex1.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

/**
 * @author guocz
 * @date 20210609
 * AOP切面类
 */
@Configuration
@Aspect
public class AopConfig {

    // 切入点--切入所有使用org.springframework.stereotype.Controller注解的类
    @Around("@within(org.springframework.stereotype.Controller)")
    public Object simpleAop(final ProceedingJoinPoint pjp) throws Throwable {
        try {
            // 调用前处理
            Object[] args = pjp.getArgs();
            System.out.println("args:" + Arrays.asList(args));
            // 调用原有的方法,o为原方法返回对象
            Object o = pjp.proceed();
            // 调完后
            System.out.println("return:" + o);
            return o;
        }catch (Throwable e) {
            throw e;
        }
    }
}
复制代码

更多使用参考:https://fiend.blog.csdn.net/article/details/103400452

posted @   幻影黑子  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-06-10 java_多线程_线程同步
点击右上角即可分享
微信分享提示