欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java常用注解及其使用方法

程序员文章站 2022-03-12 17:09:40
...

@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

实现全局数据处理,主要功能:

  1. 全局异常处理(@ExceptionHandler)
  2. 全局数据绑定(@ModelAttribute)
  3. 全局数据预处理(@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时才按照类型进行装配。

相关标签: java