aspectjweaver AspectJ

aspectjweaver AspectJ基于aop的依赖jar包,可以实现切面过滤拦截。依赖包:<!–https://mvnrepository.com/artifact/org.aspectj/aspectjweaver–><dependency><groupId>org.aspectj</groupId><artifactId>asp…

大家好,又见面了,我是你们的朋友全栈君。

基于aop的依赖jar包,可以实现切面过滤拦截。

依赖包:

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.0.RELEASE</version>
</dependency>

使用:

1.@Aspect和@Configuration添加到定义的Aspect类上,指明切面类。

2.定义切点:@Pointcut(“execution(* com.controller.Test2Controller.*(..))”)

将@Pointcut定义到切点方法上

3.切面过滤注解:

@Before(“pointcut()”)

@Around(“pointcut()”)

@AfterReturning(value = “pointcut()”,returning = “returnValue”)

@After(“pointcut()”)

@AfterThrowing

这几个注解的过滤顺序为:

@Around-joinPoint.proceed(args)前

@Before

@Around-joinPoint.proceed(args)后

@After

@AfterReturning/@AfterThrowing

4.举个栗子:

import com.alibaba.fastjson.JSON;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;

@Aspect
@Configuration
public class TestAspect {

    Logger logger = LoggerFactory.getLogger(getClass());

    // 定义切点Pointcut
    @Pointcut("execution(* .test.Test2Controller.*(..))")
    public void pointcut() {
        logger.info("pointcut---------------execute");
    }


    @Before("pointcut()")
    public void before(){
        logger.info("@Before------------execute");
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{

        Signature signature = joinPoint.getSignature();
        logger.info("@Around-joinPoint.proceed(args)前");
        logger.info("@Around-执行目标方法前参数:"+Arrays.toString(joinPoint.getArgs()));
        Object[] args = joinPoint.getArgs();
        if(args != null &&args.length>0){
            args[0]="update";
        }
        Object proceed = joinPoint.proceed(args);
        logger.info("@Around-joinPoint.proceed(args)后");
        logger.info("@Around-被织入的目标对象:" + joinPoint.getTarget());
        logger.info("@Around-返回值:"+JSON.toJSONString(proceed));
        return JSON.toJSONString(proceed);
    }

    @AfterReturning(value = "pointcut()",returning = "returnValue")
    public void afterReturning(JoinPoint point, Object returnValue) {
        logger.info("@AfterReturning-方法:"+point.getSignature().getDeclaringTypeName()+point.getSignature().getName());
        logger.info("@AfterReturning-参数:"+Arrays.toString(point.getArgs()));
        logger.info("@AfterReturning-返回值:" + returnValue);
        logger.info("@AfterReturning-被织入的目标对象:" + point.getTarget());
    }

    @After("pointcut()")
    public void after(JoinPoint point){
        logger.info("@After-方法:"+point.getSignature().getDeclaringTypeName()+point.getSignature().getName());
        logger.info("@After-参数:"+Arrays.toString(point.getArgs()));
        logger.info("@After-被织入的目标对象:" + point.getTarget());
    }
    @AfterThrowing("pointcut()")
    public void afterThrowing(JoinPoint point){
        logger.info("@AfterThrowing-----",point.getTarget());
    }

}

控制台:

2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.around(TestAspect.java:36)
-@Around-joinPoint.proceed(args)前
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.around(TestAspect.java:37)
-@Around-执行目标方法前参数:[null]
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.before(TestAspect.java:29)
-@Before------------execute
执行test-----update
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.around(TestAspect.java:43)
-@Around-joinPoint.proceed(args)后
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.around(TestAspect.java:44)
-@Around-被织入的目标对象:net.buybal.order.controller.test.Test2Controller@155814e5
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.around(TestAspect.java:45)
-@Around-返回值:"update"
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.after(TestAspect.java:59)
-@After-方法:net.buybal.order.controller.test.Test2Controllertest
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.after(TestAspect.java:60)
-@After-参数:[update]
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.after(TestAspect.java:61)
-@After-被织入的目标对象:net.buybal.order.controller.test.Test2Controller@155814e5
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.afterReturning(TestAspect.java:51)
-@AfterReturning-方法:net.buybal.order.controller.test.Test2Controllertest
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.afterReturning(TestAspect.java:52)
-@AfterReturning-参数:[update]
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.afterReturning(TestAspect.java:53)
-@AfterReturning-返回值:"update"
2019-11-26 17:22:56 [http-bio-9998-exec-1] INFO -Caller+0    at *.TestAspect.afterReturning(TestAspect.java:54)
-@AfterReturning-被织入的目标对象:net.buybal.order.controller.test.Test2Controller@155814e5
2019-11-26 17:19:27 [http-bio-9998-exec-1] INFO -Caller+0    at *.aspect.TestAspect.around(TestAspect.java:36)
-@Around-joinPoint.proceed(args)前
2019-11-26 17:19:27 [http-bio-9998-exec-1] INFO -Caller+0    at *.aspect.TestAspect.around(TestAspect.java:37)
-@Around-执行目标方法前参数:[null]
2019-11-26 17:19:27 [http-bio-9998-exec-1] INFO -Caller+0    at *.aspect.TestAspect.before(TestAspect.java:29)
-@Before------------execute
执行test-----update
2019-11-26 17:19:27 [http-bio-9998-exec-1] INFO -Caller+0    at *.aspect.TestAspect.after(TestAspect.java:59)
-@After-方法:net.buybal.order.controller.test.Test2Controllertest
2019-11-26 17:19:27 [http-bio-9998-exec-1] INFO -Caller+0    at *.aspect.TestAspect.after(TestAspect.java:60)
-@After-参数:[update]
2019-11-26 17:19:27 [http-bio-9998-exec-1] INFO -Caller+0    at *.aspect.TestAspect.after(TestAspect.java:61)
-@After-被织入的目标对象:net.buybal.order.controller.test.Test2Controller@2965bb5f
2019-11-26 17:19:27 [http-bio-9998-exec-1] INFO -Caller+0    at *.aspect.TestAspect.afterThrowing(TestAspect.java:65)
-@AfterThrowing-----

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/157905.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Python正则表达式语法_re正则表达式语法

    Python正则表达式语法_re正则表达式语法python正则表达式的语法及使用概念:按照程序员的指示,字符串里提取你要的数据。应用:爬虫清洗数据,匹配电话,匹配邮箱,匹配账号……最重要的就是(.*?)正则语法(元字符)1、?:前面的内容出现0-1次2、+:前面的内容出现1-多次3、*:前面的内容出现0-多次‘’’正则(Regular):记住的点:1、(.?)2、re.findall()结果是一个列表3、用(.?)的是后,一定要复制,而不是手敲!‘’’importre‘’’正则语法(普通字符):

    2022年10月3日
    3
  • vscode服务器浏览器打开html_vscode实时预览HTML

    vscode服务器浏览器打开html_vscode实时预览HTMLVscode默认是在控制台下查看html文件,对于我们查看和调试都很不方便,那如何在浏览器中打开呢?1.新建一个HTML文件2.点击左侧的扩展,打开扩展栏3.在扩展栏的搜索栏中输入openinbrowser,找到openinbrowser这款插件,点击右下角“安装”字样即可安装。因为我已经安装了,所以再搜索不会显示安装字样4.安装完成后可以看一下这款插件的扩展文档,里面有插…

    2022年8月21日
    32
  • 学生选课管理系统_学生管理系统的主要内容

    学生选课管理系统_学生管理系统的主要内容文件下载地址:https://download.csdn.net/download/axiebuzhen/108950621.业务描述设计本系统,模拟学生选课的部分管理功能。学生入校注册后需统一记录学生个人基本信息,对于面向学生开设的相关课程需要记录每门课程的基本信息,每个任课教师规定其可主讲三门课程,学生选课时系统将相应的选课信息记录入库,考试结束后需在相应的选课记录中补上考试成绩。简化…

    2022年10月15日
    4
  • c++的字符串数组string[通俗易懂]

    c++的字符串数组string[通俗易懂]用字符数组来存放字符串并不是最理想和最安全的方法。C++提供了一种新的数据类型——字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量——用一个名字代表一个字符序列。实际上,string并不是C++语言本身具有的基本类型,它是在C++标准库中声明的一个字符串类,用这种类可以定义对象。每一个字符串变量都是string类的一个对象。一、字符…

    2025年6月15日
    2
  • java setdaemon_Java Thread setDaemon()方法

    java setdaemon_Java Thread setDaemon()方法Thread 类的 setDaemon 方法用于将线程标记为守护程序线程或用户线程 它的生命依赖于用户线程 即当所有用户线程都消亡时 JVM 会自动终止该线程 必须在线程启动之前调用它 如果在声明线程后调用 setDaemon 方法 则此方法将抛出 IllegalThrea 语法 publicfinalv booleanon 参数 on 如

    2025年6月13日
    3
  • visual paradigm创建类图_uml对象图例子

    visual paradigm创建类图_uml对象图例子Visual Paradigm 教程[UML]:如何使用子图?

    2022年4月22日
    161

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号