首页 > 其他分享 >Spring 接点、切点、切面、引入、织入、通知 概念

Spring 接点、切点、切面、引入、织入、通知 概念

时间:2024-02-07 15:11:22浏览次数:22  
标签:get Spring 切点 public 织入 params 切面 import ORDER

import com.github.pagehelper.PageHelper;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.regex.Pattern;

/**
 * @author Sheeper
 * @date 2018/5/23.
 */
@Aspect
@Configuration
@Order(2)
public class PageOrderAspect {

    public final static String PAGE = "page";
    public final static String PAGE_NUM = "pageNum";
    public final static String ORDER_KEY = "orderKey";
    public final static String ORDER_MODEL = "orderModel";
    public final static String PRIMARY_KEY = "primaryKey";
    public final static Pattern pattern = Pattern.compile("^\\w+$");

    @Pointcut("execution(* com.example.service..*.list*(..))")
    public void pageOrder() {
    }

    @Around("pageOrder()")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] objects = joinPoint.getArgs();
        if (objects.length == 1 && objects[0] instanceof Map) {
            Map<String, Object> params = (Map<String, Object>) objects[0];
            if (params.containsKey(PAGE) && params.containsKey(PAGE_NUM)) {
                try {
                    PageHelper.startPage(Integer.parseInt(params.get(PAGE).toString())
                            , Integer.parseInt(params.get(PAGE_NUM).toString()));
                } catch (Exception e) {
                    //throw new ValidateException("com_page_parameters_error");
                }
            } else {
              //  throw new ValidateException("com_page_empty");
            }

            if (params.containsKey(ORDER_KEY) && !StringUtils.isEmpty(params.get(ORDER_KEY))
                    && params.containsKey(ORDER_MODEL) && !StringUtils.isEmpty(params.get(ORDER_MODEL))) {

                if (!pattern.matcher(String.valueOf(params.get(ORDER_KEY))).matches()) {
                   // throw new BusinessLogicException("request_param_error");
                }

                if (!pattern.matcher(String.valueOf(params.get(ORDER_MODEL))).matches()) {
                   // throw new BusinessLogicException("request_param_error");
                }

                String orderBy = params.get(ORDER_KEY) + " " + params.get(ORDER_MODEL);
                if (params.containsKey(PRIMARY_KEY)) {
                    orderBy = orderBy + ", " + params.get(PRIMARY_KEY);
                }
                PageHelper.orderBy(orderBy);
            }
        }
        return joinPoint.proceed();
    }
}

  

代码示例中,可以将以下概念与代码相对应:

  1. 切点(Pointcut):切点是一组方法的集合,用于指定在何处应用切面逻辑。在代码中,pageOrder() 方法使用 @Pointcut 注解定义了一个切点,表示匹配特定方法的执行。

  2. 切面(Aspect):切面是包含切入点和通知的类。在代码中,PageOrderAspect 类被标记为切面,通过 @Aspect 注解进行声明。

  3. 引入(Introduction):引入允许向现有类添加新方法或属性。在给定的代码示例中,并没有涉及到引入的概念。

  4. 织入(Weaving):织入是将切面应用到目标对象并创建代理对象的过程。在给定的代码示例中,织入是通过 @Around 注解和 doAround() 方法实现的。@Around 注解将切面逻辑织入到目标方法的执行前后。

  5. 通知(Advice):通知是切面在特定连接点执行的代码。在给定的代码示例中,doAround() 方法使用 @Around 注解作为环绕通知,该通知包裹了目标方法,并在其执行前后进行额外操作。

综上所述,在给定的代码示例中,切点对应 pageOrder() 方法,切面对应 PageOrderAspect 类,织入和通知则由 doAround() 方法实现。至于引入,则在该代码示例中没有涉及到。

标签:get,Spring,切点,public,织入,params,切面,import,ORDER
From: https://www.cnblogs.com/wanglichaoya/p/18010945

相关文章

  • Spring Boot + Lua = 王炸!
    曾经有一位魔术师,他擅长将SpringBoot和Redis这两个强大的工具结合成一种令人惊叹的组合。他的魔法武器是Redis的Lua脚本。今天,我们将揭开这个魔术师的秘密,探讨如何在SpringBoot项目中使用Lua脚本,以解锁新的可能性和提高性能。如果你一直在寻找提升你的应用程序的方法,那么这篇博......
  • 【Spring】SpringBoot3+SpringBatch5.xの構築
    ■概要  ■POMのXMLの設定<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=&qu......
  • SpringBoot 优雅实现超大文件上传,通用方案
    文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好的上传......
  • Springboot和Vue(2或者3都行)实现Twitter授权登录,并获取用户公开信息-OAuth1.0。
    第一步先申请twitter开发者账号,创建App,我这里没有创建app,当时好像是默认有一个app,twitter官方说,创建一个app需要先删除一个app,我是没有充钱的,不知道充钱和免费使用接口的是不是一样的。第二步在生成CustomerKey以及CustomeSecret,我之后会用到这两个,这写密钥一生成永久有效,除非......
  • 【Spring】- 自动注入注解
    【@Autowired】冷知识:@AutowiredprivateMovieCatalog[]movieCatalogs;//根据类型注入全部的bean对象数组@AutowiredprivateSet<MovieCatalog>movieCatalogs;//根据类型注入全部的bean对象集合@AutowiredprivateMap<String,MovieCatalog>movieCatalogs;//根据类型注......
  • spring boot controller设置返回json
    在SpringBoot中,Controller通常会返回JSON格式的数据,这得益于SpringBoot的自动配置能力以及内嵌的Jackson库。以下是如何设置Controller返回JSON数据的基本步骤:添加依赖:首先,确保你的项目中包含了SpringBoot的WebStarter依赖,它已经包括了Jackson库,用于处理JSON序列化。<dependen......
  • spring boot 引入 log.info("[消息服务]初始化成功"); log 爆红
    首先在idea中下载lombok插件下载完就好了一个小辣椒logo的lombok其次导入日志库的问题:确保项目的依赖中包含正确的日志库。在SpringBoot项目中,常用的是SLF4J,您可以在pom.xml(如果是Maven项目)或build.gradle(如果是Gradle项目)中添加以下依赖:xml<!--Maven--><dependencie......
  • Java微服务SpringCloud+Uniapp+Vue3+Element Plus开源BizSpring商城
    产品介绍BizSpring电商平台概述BizSpring电商平台,是基于最新SpringCloud微服务架构开发的多语言电商平台,使用领先的Vue3.0+ElementPlus+uniapp技术开发的移动全端业务、实现了多平台同步构建及建设的解决方案。应用发布基于Uni-app,实现跨多个平台(H5、公众号、头条、抖音......
  • SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka
    (之前写了一个flink-cdc同步数据的博客,发布在某N,最近代码开源了,直接复制过来了,懒得重新写了,将就着看下吧)最近做的一个项目,使用的是pg数据库,公司没有成熟的DCD组件,为了实现数据变更消息发布的功能,我使用SpringBoot集成Flink-CDC采集PostgreSQL变更数据发布到Kafka。 一、业务......
  • SpringBoot使用Validation框架手动校验对象是否符合规则
      在springboot项目中引入<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 伪代码importlombok.Data;import......