首页 > 其他分享 >【Spring】-Spring 之AOP注解

【Spring】-Spring 之AOP注解

时间:2024-04-10 10:01:08浏览次数:20  
标签:Spring System 切点 AOP println 注解 public

目录

Spring 之AOP注解

AOP思想:

AOP(Aspect Oriented Programming)
是一种面向切面的编程思想。面向切面编程是将程序抽象成各个切面,即解剖对象的内部,将那些影响了多个类的公共行为抽取到一个可重用模块里,减少系统的重复代码,降低模块间的耦合度,增强代码的可操作性和可维护性。AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理、增强处理。

AOP的使用场景:

权限认证、日志、事务处理、增强处理

@Aspect的使用以及基本概念:

1.切面类

@Aspect: 定义切面类,加上@Aspect、@Component注解


@Aspect
@Component
//设置注解执行的顺序
@Order(2)
public class AnnotationAspectTest {

}

2.切点 @Pointcut

/**
 * 定义切点,切点为对应controller
 */
@Pointcut("execution(public * com.example.zcs.Aop.controller.*.*(..))")
public void aopPointCut() {

}

注:execution表达式第一个表示匹配任意的方法返回值,第二个表示所有controller包下的类,第三个*表示所有方法,第一个..表示任意参数个数。

3.Advice,

在切入点上执行的增强处理,主要有五个注解:

  • @Before 在切点方法之前执行

  • @After 在切点方法之后执行

  • @AfterReturning 切点方法返回后执行

  • @AfterThrowing 切点方法抛异常执行

  • @Around 属于环绕增强,能控制切点执行前,执行后

4.JoinPoint :

方法中的参数JoinPoint为连接点对象,它可以获取当前切入的方法的参数、代理类等信息,因此可以记录一些信息,验证一些信息等;

5.使用&&、||、!、三种运算符来组合切点表达式,表示与或非的关系;

6.@annotation(annotationType) 匹配指定注解为切入点的方法;

具体代码实现:

1.AopController,用于校验aop是否生效:


@Controller
@RequestMapping("aop")
public class AopController {

    @RequestMapping("test")
    @ResponseBody
    public String aopTest(User user) {
        // System.out.println(user);
        System.out.println("aop测试");
        return "success";

    }

    @TestAnnotation(flag = false)
    @RequestMapping("aopAnnotationTest")
    @ResponseBody
    public String aopAnnotationTest(User user) {
        // System.out.println(user);
        System.out.println("aopAnnotationTest");
        return "success";

    }

}

2.AspectTest,具体的切面类,用于添加横切逻辑,切点使用execution表达式进行匹配


@Aspect
@Component
// 设置注解执行的顺序
@Order(1)
public class AspectTest {

    /**
     * 定义切点,切点为对应controller
     */
    @Pointcut("execution(public * com.example.zcs.Aop.controller.*.*(..))")
    public void aopPointCut() {

    }

    @Before("aopPointCut()")
    public void testbefor(JoinPoint joinPoint) {

        illegalParam(joinPoint);
        System.out.println("执行方法之前执行。。。。。");
    }

    @After("aopPointCut()")
    public void testAfter(JoinPoint joinPoint) {
        // illegalParam(joinPoint);
        System.out.println("执行方法之后执行。。。。。");
    }

    /**
     * 获取请求参数
     *
     * @param joinPoint
     * @return
     */
    private static void illegalParam(JoinPoint joinPoint) {

        if (joinPoint == null) {
            return;
        }
        boolean flag = false;
        try {
            // 参数值
            Object[] args = joinPoint.getArgs();
            if (args != null) {
                for (Object o : args) {
                    System.out.println(o);

                }
            }
        } catch (Exception e) {
        }
    }

}

3.AnnotationAspectTest类,具体的切面类,用于添加横切逻辑,切点指定注解


@Aspect
@Component
// 设置注解执行的顺序
@Order(2)
public class AnnotationAspectTest {

    /**
     * 定义切点,切点为添加了注解的方法
     */
    @Pointcut("@annotation(com.example.zcs.Aop.annotation.TestAnnotation)")
    public void aopPointCut() {

    }


    @Around("aopPointCut()")
    public Object Around(ProceedingJoinPoint point) throws Throwable {

        System.out.println("AnnotationAspectTest Around start ");
        // 获取注解和注解的值
        TestAnnotation annotation = getAnnotation(point);
        if (annotation != null) {
            boolean flag = annotation.flag();
            System.out.println("注解flags的值:" + flag);
        }

        // 获取参数
        Object[] args = point.getArgs();

        for (Object arg : args) {
            System.out.println("arg ==>" + arg);
        }

        // 去调用被拦截的方法
        Object proceed = point.proceed();

        return proceed;
    }

    // 获取注解
    public TestAnnotation getAnnotation(ProceedingJoinPoint point) {

        Signature signature = point.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        Method method = methodSignature.getMethod();
        if (method != null) {
            return method.getAnnotation(TestAnnotation.class);
        }
        return null;
    }

}

4.注解类TestAnnotation


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAnnotation {

    boolean flag() default true;

}

原文链接:https://blog.csdn.net/weixin_38860401/article/details/124908507

标签:Spring,System,切点,AOP,println,注解,public
From: https://www.cnblogs.com/alex-oos/p/18125402

相关文章

  • 基于java+springboot+vue实现的农产品智慧物流系统(文末源码+Lw)23-239
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用农产品智慧物流系统可以有效管理,使信息管......
  • 基于java+springboot+vue实现的人事管理系统(文末源码+Lw)23-242
    摘 要使用旧方法对人事管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在人事管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的人事管理系统对字典管理、公告管理、绩效管理、......
  • 【SpringBoot + Tomcat】【二】请求到达后端服务进程后的处理过程-连接的处理细节
    1 前言上节的后半部分,由于忙项目的事情去了,收尾的有点潦草,我们这节再继续。上节我们的思路是先简单回顾了下,SpringBoot启动和创建Tomcat的时机,然后我们还主要看了下连接器Connector的创建已经启动过程。连接器本身很重要,因为它就像一个港口或者一个枢纽,连接着客户端和服......
  • 详解Java Chassis 3与Spring Cloud的互操作
    本文分享自华为云社区《JavaChassis3技术解密:与SpringCloud的互操作》,作者:liubao68。JavaChassis3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。本文在这个架构原则基础上,讨论......
  • 2.Spring 核心与设计思想
    文章目录1.Spring是什么?1.1什么是容器?1.2什么是IoC?1.2.1传统程序开发1.2.2控制反转式程序开发1.2.3对比总结规律1.3理解SpringIoC1.4DI概念说明2.总结2.总结大家好,我是晓星航。今天为大家带来的是Spring核心与设计思想相关的讲解!......
  • 基于JAVA Springboot + Vue 前端后分离 实现【考研资讯平台】(内附设计LW + PPT+ 源码
    项目名称项目名称:考研资讯平台项目技术栈该项目采用了以下核心技术栈:后端框架/库:SpringBoot数据库:MySQL前端技术:Vue.js(前后端分离)项目展示5.1学生前台功能模块5.1.2首页在系统首页可以查看以下内容:首页考研资讯报考指南资料信息论坛信息我的跳转到后台购物......
  • 基于JAVA Springboot + Vue 前端后分离 实现【教师人事档案管理系统】(内附设计LW + PP
    项目名称项目名称:教师人事档案管理系统项目技术栈该项目采用了以下核心技术栈:后端框架/库:Java数据库:MySQL前端技术:Vue.js(前后端分离)开发工具:Eclipse项目展示5.1前台功能模块前台首页在教师人事档案管理系统首页可以查看以下内容:首页培训信息系统公告个人中心......
  • 【速记】一些Spring面试题的速记口诀
    帮助记忆,实际还是自己多练。1.Spring中应用了哪些设计模式呢?工厂模式 :Spring容器本质是一个大工厂,使用工厂模式通过BeanFactory、ApplicationContext创建bean对象。代理模式 :SpringAOP功能功能就是通过代理模式来实现的,分为动态代理和静态代理。单例模式 :Sp......
  • Springboot文件上传
    packagecom.example.springboot.controller;importcn.hutool.core.io.FileUtil;importcn.hutool.core.util.IdUtil;importcn.hutool.core.util.StrUtil;importcom.example.springboot.enity.Files;importcom.example.springboot.mapper.FileMapper;importcom.ex......
  • Spring Cloud 集成 Redis
    目录前言步骤引入相关maven依赖添加相关配置使用方法发布订阅发布一个消息注意总结前言在当今的软件开发领域,分布式系统已经成为一种主流的架构模式,尤其是在处理大规模、高并发、高可用的业务场景时。然而,随着系统复杂性的增加,缓存机制的重要性也日益凸显。缓存不......