Spring Boot面向切面加注解

这篇具有很好参考价值的文章主要介绍了Spring Boot面向切面加注解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.项目pom.xml文件引入切面依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

二.定义注解类

import java.lang.annotation.*;

/**
 * @desc 错误日志注解
 * @author lss
 */
@Target(ElementType.METHOD)   //应用于方法上面
@Retention(RetentionPolicy.RUNTIME)  //表示在运行时注解任可用
@Documented
public @interface ErrorLog {

    /**
     * 日志报错类型 
     */
    String type() default "";
	
	String centralId() default "setCentralId";
}

注解:

@Target

  • @Target 说明了Annotation所修饰的对象范围
  • 取值(ElementType)有:
  • 1.CONSTRUCTOR:用于描述构造器
  • 2.FIELD:用于描述域
  • 3.LOCAL_VARIABLE:用于描述局部变量
  • 4.METHOD:用于描述方法
  • 5.PACKAGE:用于描述包
  • 6.PARAMETER:用于描述参数
  • 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention

  • @Retention定义了该Annotation被保留的时间长短:

  • 某些Annotation仅出现在源代码中,而被编译器丢弃;而另一些却被编译在class文件中;编译在class文件中的Annotation可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotation与class在使用上是被分离的)。使用这个meta-Annotation可以对Annotation的“生命周期”限制。

  • 取值(RetentionPoicy)有:

  • 1.SOURCE:在源文件中有效(即源文件保留)

  • 2.CLASS:在class文件中有效(即class保留)

  • 3.RUNTIME:在运行时有效(即运行时保留)

@Documented

  • @Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API,因此可以被例如javadoc此类的工具文档化。Documented是一个标记注解,没有成员。

三.定义切面类,实现方法拦截和异常处理逻辑

import com.qike.sys.annotation.ErrorLog;
import com.qike.sys.service.ErrorResponseService;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect
@Component
@RequiredArgsConstructor
public class ErrorLogAspect {
	
	//切点
    @Around("@annotation(errorLog)")
    public Object around(ProceedingJoinPoint joinPoint, ErrorLog errorLog) throws Throwable {
        // 在方法执行前做些事情
        System.out.println("Before method execution...");

        try {
            // 执行被拦截的方法
            Object result = joinPoint.proceed();
            // 在方法执行后做些事情
            System.out.println("After method execution...");
            return result;
        } catch (Exception e) {
            // 记录错误信息
            // 注解自定义属性获得值
            String type = errorLog.type;
            // 异常逻辑处理
			...
			
            System.out.println("Error occurred: " + e.getMessage());
            throw e;
        }
    }
}

注解:
@Aspect

  • @Aspect:作用是把当前类标识为一个切面供容器读取

@Component

  • @Component:注解用于标记一个类,该类充当Spring应用程序上下文中的组件;

三.定义切面类,实现对象存入值

@Aspect
@Component
@RequiredArgsConstructor
public class ErrorLogAspect {
	//切点
    @Around("@annotation(errorLog)")
    public Object around(ProceedingJoinPoint joinPoint, ErrorLog errorLog) throws Throwable {
    	// 获取他们的目标对象信息
       Object[] paramValues = joinPoint.getArgs();
       // 获取所有请求的参数名称
        String[] paramNames = ((CodeSignature) joinPoint.getSignature()).getParameterNames();

		// 参数名和对象信息匹配
        Object dto = null;
        for (int i = 0; i < paramNames.length; i++) {
            if(sendDataInfo.value().equals(paramNames[i])){
                dto = paramValues[i];
            }
        }
        // 自己根据需求处理信息,例如获取centralId存入对象
    	String centralId = "12";
       ......
       // 封装进对象参数
       try{
           Method[] methods = dto.getClass().getMethods();
           for(Method m: methods){
               if(m.getName().equals(errorLog.centralId())){
                   if(ObjectUtil.isNotEmpty(centralId)){
                       m.invoke(dto,centralId);
                   }
               }
           }
       }catch (Exception e){e.printStackTrace();}
       
        //放行调用目标方法
        Object proceed = joinPoint.proceed();
        //返回值就是controller的返回值
        System.out.println("proceed = " + proceed);
        return  proceed;
    }
}

四.在方法中使用

	@ErrorLog(type = "2")
    public void splitLogTable(){
    	
    }

四.在拦截器中使用文章来源地址https://www.toymoban.com/news/detail-738549.html

@Slf4j
@Component
public class AppControllerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        HandlerMethod handlerMethod = (HandlerMethod) handler;

        try {

            log.debug(request.getServletPath());
            // 不用登录的标识
            ErrorLog loginRestrict = handlerMethod.getMethodAnnotation(ErrorLog.class);
            // 未登录可以访问
            if (null != loginRestrict) {
                return true;
            }
			......
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

到了这里,关于Spring Boot面向切面加注解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java、Java EE、Spring和Spring Boot核心注解

    文章迁移至个人博客 此页面包含常用 Java 、 Java EE 、 Spring 、 Spring Boot 、 JPA 常用注解的一站式说明。 @Component注解 @Component 注解表明被注解的类是一个“spring bean/组件”。@Component注解告诉Spring容器自动创建Spring bean。 @Autowired注解 @Autowired 注解用于自动注入 bean。@Autowired 注

    2024年02月15日
    浏览(49)
  • spring-自定义AOP面向切面注解--统一切面处理-登陆信息采集

    2023华为OD统一考试(A+B卷)题库清单-带答案(持续更新)or2023年华为OD真题机考题库大全-带答案(持续更新) 1. 先写一个登陆记录注解(//记录:XXX时间,XXX姓名,XX系统,登录成功) 2. 写一个切面对注解进行处理(业务逻辑处理,记录登陆的信息) 3.写一个登录的控制类,

    2024年02月13日
    浏览(36)
  • 【Spring进阶系列丨第十篇】基于注解的面向切面编程(AOP)详解

    ​ 注意,该类的两个细节: a、@Component注解向容器中注册一个Bean。 b、@Aspect注解表示这个是一个切面类。 c、@Before注解表示的是这个是前置增强/前置通知。 ​ 注意:对于业务Bean,我们也需要通过@Service注解来向容器中注册。 ​ 问题:我们看到对于切面类中定义的通知,有

    2024年04月23日
    浏览(49)
  • Spring Boot 中的 @PostMapping 注解,如何使用

    在 Spring Boot 中,我们经常需要编写 RESTful Web 服务,以便于客户端与服务器之间的通信。为了简化 RESTful Web 服务的开发,Spring Boot 提供了 @PostMapping 注解,它可以让我们更方便地编写 POST 请求处理方法。 在本文中,我们将介绍 @PostMapping 注解的作用、原理,以及如何在 Spring

    2024年02月16日
    浏览(47)
  • Spring Boot中的@GetMapping注解,如何使用

    Spring Boot是一个流行的Java框架,它提供了许多方便的注解和工具,使得Web应用程序的开发变得更加容易。其中,@GetMapping注解是Spring Boot中最常用的注解之一,它可以帮助开发者定义和处理HTTP GET请求。 @GetMapping注解可以用于类和方法上,用于定义HTTP GET请求的URL路径。当客户

    2024年02月11日
    浏览(47)
  • java spring boot 注解、接口和问题解决方法(持续更新)

    @RestController         是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染 @Controller         是Spring Framework中的注解,用于

    2024年02月06日
    浏览(51)
  • Spring Boot中的@MessageMapping注解:原理及使用

    在Web应用程序中,实现实时的双向通信是一项重要的功能。为了实现这种功能,需要使用WebSocket协议。Spring框架提供了Spring WebSocket模块来实现WebSocket通信。Spring Boot是基于Spring框架构建的,它提供了一些方便的注解和自动配置来简化WebSocket的开发。 @MessageMapping注解是Spring B

    2024年02月12日
    浏览(56)
  • Spring Boot中最常用注解的使用方式(上篇)

    摘要:本文将详细介绍Spring Boot中最常用的注解的使用方式,并通过代码示例加以说明。通过学习这些注解,读者将能够更好地理解和运用Spring Boot框架,构建高效的企业级应用。 1.@RequestMapping @RequestMapping :将一个HTTP请求映射到对应的控制器方法上。可以用于类和方法级别。

    2024年02月07日
    浏览(45)
  • Spring Boot中最常用注解的使用方式(下篇)

    摘要:本文是《深入解析Spring Boot中最常用注解的使用方式》的下篇内容,将继续介绍Spring Boot中其他常用的注解的使用方式,并通过代码示例进行说明,帮助读者更好地理解和运用Spring Boot框架。 1.@Autowired @Autowired :自动装配依赖对象。示例代码如下: 2. @Configuration @Config

    2024年02月07日
    浏览(38)
  • 使用注解@GrpcService在Spring Boot 中开始使用gRPC

    在现代微服务架构中,不同服务之间高效、健壮和可扩展的通信至关重要。gRPC是由Google开发的高性能开源框架,使客户端和服务器应用能够无缝、高效地进行通信。本文将指导您通过使用@GrpcService注解将gRPC集成到Spring Boot应用程序中的步骤。 在微服务和分布式系统的世界中

    2024年01月19日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包