对Java中常用注解的用法详解
什么叫注解
Java 注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:
- 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
- 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用这种配置来减少配置文件的数量。
- 在编译时进行格式检查。如@Override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。
注意注解继承只针对class 级别注解有效。
常用注解
@Controller
- @Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。
- @Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是真正处理请求的处理器。
@Autowired
@Autowired:注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。
@RequestParam
- @RequestParam:是传递参数的.
- @RequestParam:用于将请求参数区数据映射到功能处理方法的参数上。
- @RequestParam注解主要有哪些参数:
value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“{systemProperties[‘java.vm.version’]}”。 - 表示请求中可以没有名字为username的参数,如果没有默认为null,此处需要注意如下几点:
public String queryUserName(@RequestParam(value="userName" ,required =false ) String userName)
原子类型:必须有值,否则抛出异常,如果允许空值请使用包装类代替。
Boolean包装类型类型:默认Boolean.FALSE,其他引用类型默认为null。
@RequestParam(value="username", required=true, defaultValue="zhang") String username)
如果没有传入参数,则默认是"zhangsan".
public String requestparam8(@RequestParam(value="userName") String [] userNames)
或者是:
public String requestparam8(@RequestParam(value="list") List<String> list)
在传递参数的时候如果是url?userName=zhangsan&userName=wangwu时,
在实际roleList参数入参的数据为“zhangsan,wangwu”,即多个数据之间使用“,”分割;
我们应该使用上面两种方式来接收多个请求参数:
- 例如:
@RequestMapping("/testRequestParam")
@Controller
public class TestRequestParam {
private static final String SUCCESS = "success";
@RequestMapping("/user")
public String testParam(@RequestParam(value = "name") String name,
@RequestParam(value = "class", required = false, defaultValue = "haha") String cla,
Integer age) {
System.out.println("name = " + name + " class = " + cla + " age = " + age);
return SUCCESS;
}
/**
* 使用@RequestParam绑定入参,并进行配置
*
* 当请求为:testRequestParam/user?name=xx&age=666时
* 输出结果:name = xx class = haha age = 666
*
* 当请求为:testRequestParam/user?name=xx&age=888&class=heihei时
* 输出结果:name = xx class = heihei age = 888
* */
}
@PostMapping
- @PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
@GetMapping
- @GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。
@RequestMapping
- @RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
- @RequestMapping注解有六个属性—详细(点)
- @RequestMapping如果没有指定请求方式,将接收Get、Post、Head、Options等所有的请求方式。
@ResponseBody
- @ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
- 在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
- 举例:
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
User字段:userName pwd
那么在前台接收到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代码:
@RequestMapping("/login")
public void login(User user, HttpServletResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
@RequestBody
- @RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
- 举例:
@RequestMapping("/login.do")
@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
user = userService.checkLogin(loginUser);
session.setAttribute("user", user);
return new JsonResult(user);
}
@Data
- @Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法。
- 在类名上加@Data注解,导入依赖:lombok.Data。在另一个类中导入该入参类后,通过activityListParam.是可以点出没有写的Get,Set等方法。
@EqualsAndHashCode
- @EqualsAndHashCode : 注解在类上, 为类提供 equals() 和 hashCode() 方法
- 当有继承时便需要用@EqualsAndHashCode,此时只用@Data便不能引用父类的方法。通过设置callSuper = true,可以包括equals和hashCode你的超类中生成的方法的方法(例:@EqualsAndHashCode(callSuper = true))
@Accessor
- Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果,下面介绍三个属性
- fluent:fluent的中文含义是流畅的,设置为true,则getter和setter方法的方法名都是基础属性名,且setter方法返回当前对象。
@Data
@Accessors(fluent = true)
public class User {
private Long id;
private String name;
// 生成的getter和setter方法如下,方法体略
public Long id() {}
public User id(Long id) {}
public String name() {}
public User name(String name) {}
}
- chain:chain的中文含义是链式的,设置为true,则setter方法返回当前对象。
@Data
@Accessors(chain = true)
public class User {
private Long id;
private String name;
// 生成的setter方法如下,方法体略
public User setId(Long id) {}
public User setName(String name) {}
}
- prefix:prefix的中文含义是前缀,用于生成getter和setter方法的字段名会忽视指定前缀(遵守驼峰命名)。
@Data
@Accessors(prefix = "p")
class User {
private Long pId;
private String pName;
// 生成的getter和setter方法如下,方法体略
public Long getId() {}
public void setId(Long id) {}
public String getName() {}
public void setName(String name) {}
}