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

Posted qfjavabd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了那些年我们为之疯狂的注解相关的知识,希望对你有一定的参考价值。

技术图片

  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包:

  

  

  org.projectlombok

  lombok

  

  在类上加上@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{

  private T foo;

  private final String bar;

  private Example(T foo, String bar) {

  this.foo = foo;

  this.bar = bar;

  }

  public staticExampleBuilderbuilder() {

  return new ExampleBuilder();

  }

  public static class ExampleBuilder{

  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()

?

 

以上是关于那些年我们为之疯狂的注解的主要内容,如果未能解决你的问题,请参考以下文章

成功的最短路径,向那些疯狂的狠角色学习

征文| 毕业季,那些年我在大学里了解的技术内幕

Android 学习之那些年我们遇到的BUG9:Lifecycle.Event.ON_RESUME 提前触发了

Android 学习之那些年我们遇到的BUG9:Lifecycle.Event.ON_RESUME 提前触发了

那些年,我们写过的无效单元测试

那些年,我们写过的无效单元测试