对Java中常用注解的用法详解

对Java中常用注解的用法详解

  • 什么叫注解
  • 常用注解
    • @Controller
    • @Autowired
    • @RequestParam
    • @PostMapping
    • @GetMapping
    • @RequestMapping
    • @ResponseBody
    • @RequestBody
    • @Data
    • @EqualsAndHashCode
    • @Accessor

什么叫注解

Java 注解(Annotation) 为我们在代码中添加信息提供了一种形式化的方法,是我们可以在稍后某个时刻方便地使用这些数据(通过 解析注解 来使用这些数据),常见的作用有以下几种:

  1. 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@see @param @return 等
  2. 跟踪代码依赖性,实现替代配置文件功能。比较常见的是spring 2.5 开始的基于注解配置。作用就是减少配置。现在的框架基本都使用这种配置来减少配置文件的数量。
  3. 在编译时进行格式检查。如@Override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出。

注意注解继承只针对class 级别注解有效。

常用注解

@Controller

  1. @Controller用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping注解。
  2. @Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是真正处理请求的处理器。

@Autowired

@Autowired:注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

@RequestParam

  1. @RequestParam:是传递参数的.
  2. @RequestParam:用于将请求参数区数据映射到功能处理方法的参数上。
  3. @RequestParam注解主要有哪些参数:
    value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;
    required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
    defaultValue:默认值,表示如果请求中没有同名参数时的默认值,默认值可以是SpEL表达式,如“{systemProperties[‘java.vm.version’]}”。
  4. 表示请求中可以没有名字为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 list)     

在传递参数的时候如果是url?userName=zhangsan&userName=wangwu时,
在实际roleList参数入参的数据为“zhangsan,wangwu”,即多个数据之间使用“,”分割;
我们应该使用上面两种方式来接收多个请求参数:
  1. 例如:
@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

  1. @PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。

@GetMapping

  1. @GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。该注解将HTTP Get 映射到 特定的处理方法上。

@RequestMapping

  1. @RequestMapping:是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
  2. @RequestMapping注解有六个属性—详细(点)
  3. @RequestMapping如果没有指定请求方式,将接收Get、Post、Head、Options等所有的请求方式。

@ResponseBody

  1. @ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
  2. 在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
  3. 举例:
@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

  1. @RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据【xml 格式或者 json等】封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
  2. 举例:
@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

  1. @Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法。
  2. 在类名上加@Data注解,导入依赖:lombok.Data。在另一个类中导入该入参类后,通过activityListParam.是可以点出没有写的Get,Set等方法。

@EqualsAndHashCode

  1. @EqualsAndHashCode : 注解在类上, 为类提供 equals() 和 hashCode() 方法
  2. 当有继承时便需要用@EqualsAndHashCode,此时只用@Data便不能引用父类的方法。通过设置callSuper = true,可以包括equals和hashCode你的超类中生成的方法的方法(例:@EqualsAndHashCode(callSuper = true))

@Accessor

  1. Accessor的中文含义是存取器,@Accessors用于配置getter和setter方法的生成结果,下面介绍三个属性
  2. 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) {}
}

  1. 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) {}
}

  1. 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) {}
}

你可能感兴趣的:(对Java中常用注解的用法详解)