如何实现一个Java的@注解?

admin2024-04-03  0

先看一段代码:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ResponseEntity defaultErrorHandler(Exception e) {
        // 将错误信息转成字符串
        String errorMessage = ExceptionUtils.getStackTrace(e);
        // 创建响应实体,包含错误消息和状态码
        return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

上述代码中,GlobalExceptionHandler类用@ControllerAdvice注解标识,表示其定义的配置和方法能够全局应用。

然后在该类中定义了一个defaultErrorHandler方法,并用@ExceptionHandler注解标识。这个方法定义了对任意Exception类型异常的处理。当任意一个Controller中抛出Exception类型的异常时,这个方法就会被调用。方法内部首先将异常详细堆栈信息转成字符串,然后以此为响应体,返回一个500状态码的ResponseEntity对象。

所以嘛再上代码:

先定义一个注解(BankResponseBody):

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface BankResponseBody {
}

通过@ControllerAdvice注解实现和这个注解:

// ControllerAdvice将会被应用到所有带有@BankResponseBody注解的控制器!!!
@ControllerAdvice(annotations = {BankResponseBody.class}) 
@Slf4j 
// 声明了公共的 BankResponseBodyAdvice类,并实现了 ResponseBodyAdvice接口
public class BankResponseBodyAdvice implements ResponseBodyAdvice { 

    @Override // 这个方法决定当前HandlerMethod的执行返回的对象是否支持拦截
    public boolean supports(MethodParameter returnType, Class converterType) { 
        return true; // 设定为返回true,表示支持所有类型
    }

    @Override// 这个方法在将返回值写入到Response前执行
    public Object beforeBodyWrite( 
        Object body,                     // 准备写入Response的对象
        MethodParameter returnType,      // HandlerMethod的返回类型
        MediaType selectedContentType,   // 响应的内容类型
        Class selectedConverterType,     // 选择的转换器类型
        ServerHttpRequest request,       // 当前的请求对象
        ServerHttpResponse response)     // 当前的响应对象
    {
        log.info("处理XX回调接口的返回值{}",body); // 使用log对象记录一条信息,{}这是占位符,表示日志中的动态内容,这里会被body替换。
        return body;                               // 返回经处理后的对象,这里直接返回了原封不动的body
    }
}

实现了吧 (^_^)∠※

然后在Spring框架中,除了ResponseBodyAdvice,还存在许多其他接口吗?

有的常见的包括:

  1. RequestBodyAdvice接口:这个接口和ResponseBodyAdvice相似,不过它是用来处理请求数据的,即在请求数据绑定到方法参数上之前对请求数据进行预处理。

  2. HandlerInterceptor接口:这个接口用于拦截处理Controller的请求,它有三个方法:preHandle(在Controller方法执行前调用),postHandle(在Controller方法执行后,渲染视图前调用),afterCompletion(渲染视图后调用)。

  3. WebMvcConfigurer接口:这个接口通常用于扩展Spring MVC的功能,比如添加视图控制器、静态资源处理、拦截器等。

  4. ViewResolver接口:这个接口用于将逻辑视图名解析为具体的视图对象。

以上只是一部分接口,Spring中有大量的接口可供开发者使用,来满足不同的开发需求。一般来说,每个接口都有其特定的应用场景和作用,具体要选择使用哪个接口,取决于你希望实现的功能。

还有其他实用注解吗?

有的,@ControllerAdvice是Spring框架中一个非常实用的注解。它是一个@Component类,所以Spring容器会自动检测到它。@ControllerAdvice注解允许我们将一些全局的配置(例如异常处理、数据绑定等)提取出来放在一个地方,让所有的控制器都能享用,简化了代码的复用。

使用@ControllerAdvice可以做到以下的一些事情,让我们的程序更优雅:

  1. 全局异常处理:我们可以使用@ControllerAdvice和@ExceptionHandler注解捕获全局异常。

  2. 全局数据绑定:我们可以使用@ControllerAdvice和@ModelAttribute注解将常用的数据放在一个地方,每个Controller都能访问到。

  3. 全局数据预处理:我们可以使用@ControllerAdvice和@InitBinder注解,对请求参数进行预处理。

所以说,如果你正在使用Spring框架,那么这个注解肯定会是你的最佳助手之一!

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