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