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

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

  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时才按照类型进行装配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值