那些年我们为之疯狂的注解

简介: 1 @RestController导入:import org.springframework.web.bind.annotation.

1 @RestController

导入:

import org.springframework.web.bind.annotation.RestController;

官方文档解释:

@RestController is a stereotype annotation that combines @ResponseBody and @Controller.

可以看出,@RestController = @ResponseBody + @Controller,也就是说如果使用了@RestController来注解Controller,那么表示这个Controller中的方法只能返回你封装好的result vo类,一般前端拿到的是一个json字符串,而不能返回jsp页面,在配置文件中配置的视图解析器在这个Controller里将失效。

2 @Slf4j

在类上使用这个注解可以直接实现日志输出,可以替代我们在需要打日志的每个类中的代码:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private static final Logger LOGGER = LoggerFactory.getLogger(FeatureConfigController.class);

使用方法:

在pom.xml引入相应jar包:

<!--可以引入日志 @Slf4j注解-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

在类上加上@Slf4j注解,然后在方法中可以直接使用log变量来打日志。如果注解@Slf4j注入后找不到变量log,需要IDEA安装lombok插件:File → settings → Plugins ,搜索lombok。

3 @SneakyThrows

导入:

import lombok.SneakyThrows;

@SneakyThrows注解使用在方法上时,当该方法内有异常时不必try catch,也不必throws,@SneakyThrows注解会自动帮你向上抛出。

使用方法:

import lombok.SneakyThrows;

public class SneakyThrowsExample implements Runnable {
  @SneakyThrows(UnsupportedEncodingException.class)
  public String utf8ToString(byte[] bytes) {
    return new String(bytes, "UTF-8");
  }
  
  @SneakyThrows
  public void run() {
    throw new Throwable();
  }
}

@SneakyThrows要慎用,相关官方文档

4 @GetMapping、@PostMapping、@PutMapping、@DeleteMapping

Spring4.3中引进了{@GetMapping、@PostMapping、@PutMapping、@DeleteMapping},来帮助简化常用的HTTP方法的映射,并更好地表达被注解方法的语义。

@{Get/Post/Put/Delete}Mapping是一个组合注解,是@RequestMapping(method = RequestMethod.{Get/Post/Put/Delete})的缩写。该注解将HTTP {Get/Post/Put/Delete} 映射到 特定的处理方法上。

使用方法:

@PostMapping("requestpath")
public ResultVo function(){}

5 @PreAuthorize、@PostAuthorize

Spring的 @PreAuthorize/@PostAuthorize 注解更适合方法级的安全,也支持Spring 表达式语言,提供了基于表达式的访问控制。

@PreAuthorize 注解适合进入方法前的权限验证,@PreAuthorize可以将登录用户的roles/permissions参数传到方法中。

@PostAuthorize 注解使用并不多,在方法执行后再进行权限验证。

所以它适合验证带有返回值的权限。Spring EL 提供 返回对象能够在表达式语言中获取返回的对象returnObject。

还有@EnableWebSecurity和@EnableGlobalMethodSecurity,下面给了一个Spring Security With Annotation demo,可以看看具体的使用方法。

一个Spring Security With Annotation demo

6 @ControllerAdvice @ExceptionHandler

异常的统一处理。

@ControllerAdvice,是spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强。使用@ControllerAdvice注解某个类的时候,该类会被spring当做一个组件,可以在context:component-scan被扫描到。

@ExceptionHandler,异常处理器,应用到所有@RequestMapping注解的方法上,在其抛出指定异常时执行统一异常处理方法。

@ControllerAdvice 
@Slf4j
public class ControllerAdviceTest {  
  
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResultVo handleException(Exception e) {  
        log.warn("抛出{}异常", e);  
        //返回一个结果类vo 
        ResultVo result = new ResultVo();
        result.setStatus(Constants.Fail);
        result.setMsg(e.getMessage());
        return result;  
    }  
}  

7 其它常用的 lombok 注解

@Data :注解在类上;提供类所有属性的 getting 和 setting 方法,此外还提供了equals、canEqual、hashCode、toString 方法

@EqualsAndHashCode:实现equals()方法和hashCode()方法

@ToString:实现toString()方法

@Setter:注解在属性上;为属性提供 setting 方法

@Getter:注解在属性上;为属性提供 getting 方法

@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法

@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法

@Builder:使用构建模式(Builder pattern)构建一个类实例

不使用 lombok 的方案

public class Example<T> {
        private T foo;
        private final String bar;

        private Example(T foo, String bar) {
                this.foo = foo;
                this.bar = bar;
        }

        public static <T> ExampleBuilder<T> builder() {
                return new ExampleBuilder<T>();
        }

        public static class ExampleBuilder<T> {
                private T foo;
                private String bar;

                private ExampleBuilder() {}

                public ExampleBuilder foo(T foo) {
                        this.foo = foo;
                        return this;
                }

                public ExampleBuilder bar(String bar) {
                        this.bar = bar;
                        return this;
                }

                @java.lang.Override 
                public String toString() {
                        return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
                }

                public Example build() {
                        return new Example(foo, bar);
                }
        }
 }

使用 lombok 的方案 guava 16.0.1

 @Builder
 public class Example {
        private int foo;
        private final String bar;
 }

构造一个Example实例,属性不需要单独set

Example.builder().foo(1).bar(“test”).build()


作者:损失函数
链接:https://www.imooc.com/article/73274
来源:慕课网
本文原创发布于慕课网 ,转载请注明出处,谢谢合作

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
4月前
|
Java 编译器
你说啥什么?注解你还不会?
你说啥什么?注解你还不会?
34 0
|
10月前
|
Java 编译器 数据库连接
注解
注解是JAVA5引入JAVA的一个特性,理解起来会有点抽象,这里笔者先给出自己对注解的一个理解——注解就是一张便签! 其次要有一个概念就是注解的应用是基于反射的。 本文举出的三个实例中例1和例3是引用其它的优秀文献 出处为how2J以及 https://blog.csdn.net/briblue/article/details/73824058一文
44 0
|
11月前
@PostMapping注解
@PostMapping注解
|
Java 编译器 Spring
什么是注解
什么是注解
|
Java 编译器
关于@FunctionalInterface注解
FunctionalInterface
323 0
关于@FunctionalInterface注解
|
存储 JSON Java
一文学会注解的正确使用姿势
一文学会注解的正确使用姿势
一文学会注解的正确使用姿势
|
XML Dubbo Java
duboo注解使用详解
当越来越的的接口与实现类的增加后,duboo的xml配置会越来越多,为了防止几百几千行的代码,减少开发人员配置xml的工作量,使用duboo的注解模式,减少配置多出问题多的可能性!
131 0
duboo注解使用详解
扒一扒@Retryable注解,很优雅,有点意思! (3)
扒一扒@Retryable注解,很优雅,有点意思! (3)
427 0
扒一扒@Retryable注解,很优雅,有点意思! (3)
扒一扒@Retryable注解,很优雅,有点意思! (4)
扒一扒@Retryable注解,很优雅,有点意思! (4)
188 0
扒一扒@Retryable注解,很优雅,有点意思! (4)
|
缓存
扒一扒@Retryable注解,很优雅,有点意思! (2)
扒一扒@Retryable注解,很优雅,有点意思! (2)
250 0
扒一扒@Retryable注解,很优雅,有点意思! (2)