继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

损失函数
关注TA
已关注
手记 70
粉丝 1533
获赞 2735

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,可以看看具体的使用方法。

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()
打开App,阅读手记
5人推荐
发表评论
随时随地看视频慕课网APP