[SpringBoot]-SpringBoot框架中的注解

SpringBoot常见的注解
参考:
https://www.php.cn/faq/417146.html
https://blog.csdn.net/weixin_40753536/article/details/81285046
@RequestMapping:https://blog.csdn.net/renanrenan/article/details/84654362/
@RequestPraram;https://blog.csdn.net/sswqzx/article/details/84195043
@RequestBody @ResponeBody:https://blog.csdn.net/originations/article/details/89492884 https://blog.csdn.net/mk1843109092/article/details/108493244

1. @SpringBootApplication

生命让spring boot自动给程序进行必要的配置,这个配置等同于:@Configuration 、@EnableAutoConfiguration 、 @ComponentScan 三个配置。
通常用在主类上。

2. @Configuration

指出该类是 Bean 配置的信息源,相当于XML中的,一般加在主类上。

3. @EnableAutoConfiguration

SpringBoot自动配置(auto-configuration):让 Spring Boot 根据应用所声明的依赖来对 Spring 应用框架进行自动配置,一般加在主类上。

4. @ComponentScan:

组件扫描。相当于,如果扫描到有@Component @Controller @Service等这些注解的类,则把这些类注册为bean。

5. @Service

用于标注业务层组件。

6. @Repository

用于标注数据访问组件,即DAO组件。使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,不需要为它们提供XML配置项。

7. @Component

泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。


8. @Bean

相当于XML中的,放在方法的上面,而不是类,意思是产生一个bean,并交给spring管理。

9. @AutoWired

byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
当加上(required=false)时,就算找不到bean也不报错。


10. @RestController

用于标注控制层组件(如struts中的action),是@Controller和@ResponseBody的合集

11. @Controller

用于定义控制器类,在spring项目中由控制器负责将用户发来的URL请求转发到对应的服务接口(service层)。通常需要配合注解@RequestMapping。


12. @RequestMapping

  • RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

  • 该注解有六个属性:

    • params:指定request中必须包含某些参数时,才让该方法处理。
    • headers:指定request中必须包含某些指定的header值,才能让该方法处理请求。
    • value:指定请求的实际地址,指定的地址可以是URI Template 模式。有时候也用path 属性,path和value属性完全相同。如果仅有这一个属性,则可以省略。
    • method:指定请求的method类型, GET、POST、PUT、DELETE等
    • consumes:指定处理请求的提交内容类型(Content-Type),如application/json, text/html;
    • produces:指定返回的内容类型(Content-Type),仅当request请求头中的(Accept)类型中包含该指定类型才返回。

样例1:@RequestMapping 注解在 login 方法上,仅有一个path属性、省略。如下访问login()方法的访问路径就是http://xxxxx/login

@RestController
public class UserController {
	@RequestMapping("/login")
	public String login() {
		return "success";
	}
}

样例2: @RequestMapping 注解在 UserController 类上,这时类的注解是相对于 Web 根目录,而方法上的是相对于类上的路径。也就是说此时login()方法的访问路径是http://xxxxx/user/login

@RestController
@RequestMapping("/user")
public class UserController {
 
	@RequestMapping("/login")
	public String login() {
		return "success";
	}

样例3:限定访问的方法HTTP消息类型是GET

@RestController
@RequestMapping("/user")
public class UserController {
 
	@RequestMapping(path = "/login", method = RequestMethod.GET)
	public String login() {
		return "success";
	}
}

样例3:限定访问的方法HTTP消息类型是GET

@RestController
@RequestMapping("/user")
public class UserController {
 
	@RequestMapping(path = "/login", method = RequestMethod.GET)
	public String login() {
		return "success";
	}
}

样例4:@ RequestMapping 注解类中 method() 方法返回的是 RequestMethod 数组,所以可以给 method 同时指定多个请求方式,例如:

@RestController
@RequestMapping(path = "/user")
public class UserController {
    // 该方法将同时接收通过GET和POST方式发来的请求
    @RequestMapping(path = "/login", method={RequestMethod.POST,RequestMethod.GET})
	public String login() {
		return "success";
	}
}

样例5:@RequestMapping注解中指定Params、Header等参数

@RestController
@RequestMapping(path = "/user")
public class UserController {
    // 该方法将接收 /user/login 发来的请求,且请求参数必须为username=kolbe&password=123456
    @RequestMapping(path = "/login", params={"username=kolbe","password=123456"}, headers="Host=localhost:8080", )
	public String login() {
		return "success";
	}

样例6:@RequestMapping注解中指定produces。如下注明UserController类中方法返回的响应内容都是JSON格式。

@RestController
@RequestMapping(path = "/login", produces = "application/json;charset=UTF-8")
public class UserController {
    public String login() {
		return "success";
	}
}

13. @GetMapping

Spring的复杂性不是来自于它处理的对象,而是来自于自身,不断演进发展的Spring会带来时间维度上复杂性,比如SpringMVC以前版本的@RequestMapping,到了新版本被下面新注释替代,相当于增加的选项:

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping
    从命名约定我们可以看到每个注释都是为了处理各自的传入请求方法类型,即@GetMapping用于处理请求方法的GET类型,@PostMapping用于处理请求方法的POST类型等。
    @GetMapping等主机的属性参数使用方法与@RequestMapping相同。

如果我们想使用传统的@RequestMapping注释实现URL处理程序,那么它应该是这样的:
@RequestMapping(value = "/get/{id}", method = RequestMethod.GET)
新方法可以简化为:
@GetMapping("/get/{id}")

样例:

@RestController
@RequestMapping(path = "/user")
public class UserController {
        
    @RequestMapping(value="/{id}", method=RequestMethod.GET)
	public String show(@PathVariable("id") Integer id) {
		return "success";
    }
}

可简化为

@RestController
@RequestMapping(path = "/user")
public class UserController {
        
    @GetMapping(value="/{id}")
	public String show(@PathVariable("id") Integer id) {
		return "success";
    }
}

14. @RequestParam

用在方法的参数前面。将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解。

语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)

  • value:参数名
  • required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错。
  • defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值。

样例:

@RestController
@RequestMapping(path = "/user", produces = "application/json;charset=UTF-8")
public class UserController {
    @RequestMapping(path = "/login")
    public String login(@RequestParam(value="name", required=false) String name) {
		return name + "login success!";
	}
}

访问URI中http://xxxxx/user/login?name=tiantian。name参数的值tiantian会作为login()方法的入参name。

15. @PathVariable

路径变量。参数与大括号里的名字一样要相同。
URI中带占位符的URL是Spring 3.0 新增的功能,可以通过 @PathVariable 将 URL 中的占位符绑定到控制器的处理方法的参数中,占位符使用{}括起来。
样例:

@RestController
@RequestMapping(path = "/user")
public class UserController {
        
	@RequestMapping(value="/{id}", method=RequestMethod.GET)
	public String show(@PathVariable("id") Integer id) {
		return "success";
	}
}

在这个控制器中show() 方法将可以接收 user/1、user/2、user/3等路径请求,请求的方法必须为GET,使用 @PathVariable 为应用实现 REST 规范提供了具大的便利条件。

PS:REST规范风格
REST(Representational State Transfer):(资源)表现层状态转化,它是目前最流行的一种软件架构,其结构清晰、易于理解、扩展方便且符合标准,正在越来越多的被实践到应用中。
REST 风格的 URL 请求:
请求路径 请求方法 作用
-/user/1 HTTP GET 得到id为1的user
-/user/1 HTTP DELETE 删除id为1的user
-/user/1 HTTP PUT 更新id为1的user
-/user HTTP POST 新增user

16. @ResponseBody

作用在方法上。作用是将的controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP response body中。通常用来返回JSON数据或者XML数据。

一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。
比如异步获取json数据,加上@responsebody后,会直接返回为JSON数据。

@ResponseBody主机作用于方法时的返回内容格式:

  1. 返回值为普通字符串
    此时,该注解会把响应头 Content-Type 设置为 text/html,把方法返回值以流的形式直接输出。
    如果返回值包含中文,会出现中文乱码。需要在 @RequestMapping 设置 produces 参数,指定字符编码类型。
    @RequestMapping(value="test", produces="text/html;charset=utf-8")
	@ResponseBody
	public String test() {
		return "中文";
	}
  1. 当返回值满足 key-value 形式时(返回值可以是 对象、list集合、map集合)
    此时,该注解会把响应头设置为 application/json;charset=utf-8,不会乱码 ,此时会把数据转换为 json 格式后,以输出流的形式响应给客户端,底层使用 Jackson 进行 json 转换。
    注:如果方法返回值满足key-value形式,注解@responseBody就是指定返回值是json数据。本方法的@RequestMapping/@GetMapping等注解中就可以不重复注明produces="application/json"了
@RestController
public class UserController {
	@RequestMapping("/login")
    @ResponseBody
	public String login() {
		return new LoginResult(200);
	}
}

17. @RequestBody

@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

作用:

  1. 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
  2. 再把HttpMessageConverter返回的对象数据绑定到controller中方法的参数上。

说明:request的body部分的数据编码格式由header部分的Content-Type指定。

不同类型的请求,使用RequestBody的限制:

  1. GET、POST方式提交时, 根据request header Content-Type的值来判断:
    1. application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
    2. multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
    3. 其他格式, 必须。(其他格式包括application/json, application/xml等,这些格式的数据,必须使用@RequestBody来处理);
  2. PUT方式提交时, 根据request header Content-Type的值来判断:
    1. application/x-www-form-urlencoded, 必须;
    2. multipart/form-data, 不能处理;
    3. 其他格式, 必须;

样例:

@RestController
public class UserController {
	@GetMapping("/user")
    @ResponseBody
    
    // 将请求内容写入User对象中
    public String login(@RequestBody User user) { 
    	return user; //前面定义了@ResponeBody,则直接把user对象写入HTTP响应正文
    }
}

18.@Value

@Value(value = “${user.userName}”)
@Value(“${user.userName}”)
就会把配置文件里的定义的字段的只值赋给@Value注解指定的属性。


18. 其他类和属性的一些注解

(1)@Log4j2
注解在类上。为类提供一个属性名为log的log4j 日志对象,和@Log4j注解类似。

19. 其他注解

(1)@Override
@0veride是伪代码,表示重写。当然不写@Override也可以,不过写上有如下好处:
- 可以当注释用,方便阅读;
- 编译器可以验证@Override下面的方法名是否是父类中所有的,如果没有则报错。

posted @ 2021-02-19 20:11  小拙  阅读(375)  评论(0编辑  收藏  举报