Java常用注解及其使用方法
@RequestMapping和@GetMapping、@PostMapping
在类和方法的声明中使用,指定URL请求路径,作为请求的映射地址。
参数:
value:指定映射地址
method:指定请求方式
params:限制请求参数,实现过滤请求,不通过返回404错误
Headers:限制前端发送过来请求的headers的内容
示例:
@RequestMapping("/user")
public class UserController {
@RequestMapping(path = "/login", method = RequestMethod.GET,params={"username=poly","password=123456"}, headers="Host=localhost:8080")
public String login() {
return "success";
}
}
@GetMapping是一个组合注解,是@RequestMapping(method =RequestMethod.GET)的缩写。
@PostMapping是一个组合注解,是@RequestMapping(method =RequestMethod.POST)的缩写。
@RequestBody
用来接收前端传递过来的数据,作用在形参列表上,用于将前端发送过来的固定格式的数据(json)封装为对应的JavaBean对象。
示例:
public Result queryInfo(@RequestBody String json) {
ContractInfoRequest info = FastJsonUtil.string2obj(json, ContractInfoRequest.class);
}
@ResponseBody
作用于方法上,将方法返回的对象,通过适当转换器,转化为指定的格式后,写入response的body去,通常用来返回json或者xml数据。使用此注解后,不会再走视图处理器,而是直接将数据写入到输出流中。一般在异步获取数据(Ajax)时使用。
示例:
public class UserController {
@RequestMapping(path = "/login", method = RequestMethod.POST)
@ResponseBody
public String login() {
return "success";
}
}
@JsonFormat
时间格式化注解,主要用于后端到前端的时间格式化转换,如果用于接收前端传递的json串,也可使用该注解对数据进行格式化,但是得先用@ReuqestBody接收数据,再进行转化。在mysql中的date类型数据,当读取出来封装在实体类中的时候,会格式化为英文的时间格式,例如:“Fri Jan 22 21:05:20 CST 2021”,不是我们想要的“yyyy-MM-dd HH:mm:ss”这样的中文时间,因此我们使用@JsonFormat注解来格式化时间。
@JsonFormat注解是fasterxml.jackson包里面的一个注解,使用时需要引入fasterxml maven的jar包,例如:
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<name>Jackson-core</name>
<version>2.10.0</version>
注意:@JsonFormat注解只会在类似@ReuqestBody或者@ResponseBody,接收或者返回json的时候有效,如果直接使用System.out.println()输出时间格式的时候是不生效的。
示例:
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date repayDate;
pattern:需要转化的日期格式
timezone:设置时区
@DateTimeFormat
时间格式化注解,用于前端到后端的时间格式化转换,规定接收键值对中的时间格式。
@RestController和@Controller
在Controller中声明类的时候使用,@RestController相当于@Controller和@ResponseBody的结合,使用此注解后,不会再走视图处理器,而是直接将数据写入到输出流中,即response的body中。
如果Controller中需要走视图,返回jsp或者html页面,就需要使用@Controller,不能使用@RestController;
如果需要在使用@Controller注解的Controller,但是需要在页面中返回json等数据,那么就需要使用@ResponseBody注解该方法。
@ControllerAdvice和@RestControllerAdvice
实现全局数据处理,主要功能:
- 全局异常处理(@ExceptionHandler)
- 全局数据绑定(@ModelAttribute)
- 全局数据预处理(@InitBinder)
全局异常处理,由@ExceptionHandler 注解用来指明异常的处理类型
示例:
@ControllerAdvice
public class GlovalExceptionHandler {
@ExceptionHandler(NullpointerException.class)
@ResponseBody
public String NullpointerErrorHandler(HttpServletRequest req, NullpointerException e) {
return e.getMessage();
}
@ExceptionHandler(ArrayIndexOutOfBoundsException.class)
@ResponseBody
public String ArrayIndexOutErrorHandler(HttpServletRequest req, ArrayIndexOutOfBoundsExceptione) {
return e.getMessage();
}
}
该类中,可以定义多个方法,不同的方法处理不同的异常,用@ExceptionHandler的value指定异常类型。例如示例中的空指针异常和数组越界异常方法,也可以在一个方法中处理所有异常,异常类型可以定义如下:
@ExceptionHandler(Exception.class)
@ControllerAdvice可以指定作用范围,如果只想对某个包下的控制器使用,可以定义如下:
@ControllerAdvice("com.example")
public class GlovalExceptionHandler {}
如果只想对其中某几个控制器使用,可以用逗号分割,定义如下:
@ControllerAdvice(assignableTypes = {MainController.class,UserController.class})
public class GlovalExceptionHandler {}
全局数据绑定,由@ModelAttribute注解标记该方法的返回数据是一个全局数据,可以用来定义一些初始化的数据操作。
@RestControllerAdvice和@ControllerAdvice区别,可以参照@RestController和@Controller。
@Override
重写注解,表示子类重写了父类的方法,也可以不写,写的好处是:
1、可读性提高
2、编译器会校验写的方法在父类中是否存在
@ResponseStatus
该注解一般用来自定义异常或者修饰方法。
自定义异常示例:
@ResponseStatus(reason = "测试",value = HttpStatus.NOT_FOUND)
public class UserException extends RuntimeException{ }
修饰方法用法示例:
@RequestMapping("/user")
public class UserController {
@ResponseStatus(reason = "测试",value = HttpStatus.NOT_FOUND)
@RequestMapping(path = "/login", method = RequestMethod.GET)
public String login() {
return "success";
}
}
此时,所有进入/user/login的请求,都会报错。
@Data 和@ToString
@Data是将@ToString,@EqualsAndHashCode,@Getter,@Setter等功能捆绑在一起的方便快捷方式,一般用在实体类中,实现。
如果在类中,没有重写toString,并且使用@Data注解在调用toString的时候,只会打印子类自己的属性,如果想一并打印父类的属性,需要重写子类的toString方法,或者在加上@Data注解的同时,加上@ToString注解。
@Data注解,可省略get、set获取或者给属性赋值的方法,节省代码量,但是,实际生成的编译后代码中,get、set方法会自动生成。因为@Data注解所包含的@Getter,@Setter注解生成的属性作用于都是public,可以通过在类或者字段上添加明确的@Getter和/或@Setter注解来覆盖访问级别。可以使用此注解(同AccessLevel.NONE组合使用)来完全禁止生成getter/setter。
示例:
@Data
@ToString
public class ContractAllInfo {
private String contractNumber;
}
@Component和 @Service和 @Repository
@Component注解是通用的Spring容器管理单例bean组件。
@Service注解作用于业务逻辑层,标注该类用来处理业务逻辑。
@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常。因为原生java操作数据库产生的异常只定义了几种,但是异常原因却有很多种,这样对数据库报错原因排查有一定的影响。@Repository对数据库抛出的异常原因进行了处理,输出的是经过翻译的spring专属数据库异常,方便我们排查问题。
@Slf4j
如果不想每次都写
private final Logger logger = LoggerFactory.getLogger(XXX.class);
可以用注解@Slf4j,该注解可以简化日志操作过程。
另外,在idea中使用@Slf4j报错,找不到log的时候,需要在idea中安装lombok插件,可通过如下步骤安装:
File->Settings-> Plugins->Browse repositories->搜索lombok,安装即可。
@Lazy
该注解用于标识bean是否需要延迟加载。在没有该注解的时候,容器启动的时候就会实例化bean,使用该注解后,在第一次调用的时候才会加载,可以减少springIoc容器的启动的加载时间。在一些异步处理对象上面,可以使用该注解。
@Aspect 和@Around
这两个注解用来实现AOP(面向切面编程)的。
@Aspect作用在类上面,使类具有AOP功能。在方法上面添加@Around注解,包围一个函数,可以在函数执行前做一些事情,也可以在函数执行后做一些事情。也就是说,这个注解完整说明了应该在函数的什么位置插入变化,也就是所谓的切点。把要做那些事情代码的函数体,叫做增强。包含切点和增强的结合,就叫做切面,AOP由此而来。应用实例:进入函数之前的入参校验。
示例:
@Aspect
@Component
@Slf4j
public class ControllerValidateAspect {
@Around("execution(* com.credithc.hccloud.center.assets..*.*(..))")
public Object serviceParamCheckAround(ProceedingJoinPoint joinPoint) throws Throwable {
//dosomething
}
}
@Autowired 和@Resource
@Autowired运行时生效,且适用范围很广,从构造器,到方法,到参数、属性、注解,都可以加上@Autowired注解。完成自动装配的工作。它还有一个属性required,此属性用于控制如果找不到要依赖注入的对象时是否报错,默认true即默认找不到要注入的对象时会报错。
当一个属性被@Autowired注解后,引用其的时候,会从Ioc容器中查找并返回。
注意事项:
在使用@Autowired时,首先在容器中查询对应类型的bean,如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据,如果查询的结果不止一个,那么@Autowired会根据名称来查找。如果查询的结果为空,那么会抛出异常。解决方法时,使用required=false。
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。@Resource默认按照ByName自动注入。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。
上一篇: 基础 php相关函数