1. Spring Boot 自动配置原理

image.png
启动类上标了一个复合注解@SpringBootApplication,由三个注解构成:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。
@SpringBootConfiguration:相当于@Configuration,即标注当前类是配置类。可以用java代码的形式实现spring中xml配置文件配置的效果,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
@ComponentScan扫描路径。类或接口上主要是指定扫描路径,Spring会把指定路径下带有置顶注解的类自动装配到容器中。 (路径给Spirng的,下面的@AutoConfigurationPackage扫描到的路径是给JPA的)
@EnableAutoConfiguration自动装配。将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IOC容器中。复合注解由:@Import和@AutoConfigurationPackage构成。
1.@AutoConfigurationPackage,注册扫描路径到全局变量,提供查询(为JPA)
2.@Import,自动装配的核心注解。其中的SelectImports方法,去查找META-INF/spring.factories文件中名为EnableAutoConfiguration的key,得到类的全路径,并通过SPI机制加载类。SpringFacotriesLoader. loadFactoryNames反射创建Bean加载到IOC容器中。 这样, @Configuration里标注的@Bean的都会完成自动装配。
META-INF/spring.factories文件中都是key-value形式,每个key都是一个类的全路径。

SPI机制:service provider interface ,服务发现机制,使用SPI机制扫描META-INF/spring.factories下的配置类

2. 如何理解Spring Boot 的starter

image.png

3. Spring Boot 的SPI机制

Java的SPI机制:Service Provider Interface,服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件自动加载文件里所定义的类。

SpringBoot2 - 图3

JPA:Java Persistence API,JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中

Spring Boot的SPI机制:类似Java的SPI机制,在META-INF/spring.factories文件中配置接口的实现类名称,然后在程序中读取这些配置文件并实例化。这种自定义的SPI机制是Spring Boot Starter实现的基础。

即,去xx路径查找文件,自动加载类。
自定义配置的时候就是反过来:
把实现类的名称写入配置文件,放于指定路径,后面就是交给程序自动加载并实例化了。

4. SpringBoot将对象自动转JSON

https://teavamc.blog.csdn.net/article/details/87135692

5. @RestController

@RestController = @ResponseBody + @Controller
@Controller 配合视图解析器InternalResourceViewResolver,返回指定页面(jsp、html)
在对应方法上加@ResponseBody,则视图解析器不起作用,返回JSON或XML或自定义mediaType内容

类上+@RestController = 类上+@Controller + 方法上+@ResponseBody,返回JSON等内容

6. @RequestParam,@PathVariable和@RequestBody三者区别

@RequestParam
获取参数,即是获取传送过来的参数;例如获取下面链接的id参数值——用于get请求
获取id下来并且作为形参传给方法体里面的id

  1. //链接(注意链接格式区别)
  2. http://localhost:8090/hello?id=2
  3. //使用@RequestParam注解获取id
  4. public String Demo1(@RequestParam String id){
  5. System.out.println("链接中请求参数的id:"+id);
  6. return null;
  7. }

@PathVariable
路径变量,作用是将路径上的id获取进来传递给方法体里面的形参id,但是变量名称必须一样

  1. //链接(注意比较上面一条链接)
  2. http://localhost:8090/hello/2
  3. //使用@PathVariable注解获取id
  4. @RequestMapping(value = "/getBook/{id}", method = RequestMethod.GET)
  5. public String getBook(@PathVariable Integer id) {
  6. try {
  7. system.out.println("路径上的id:"+id);
  8. } catch (ParseException e) {
  9. e.printStackTrace();
  10. }
  11. return null;
  12. }

@RequestBody
主要是用来处理content-type:"application/json charset=utf-8"或者
content-type:"application/xml charset=utf-8"两种请求数据,一般是异步请求用的比较多些

此时@requestBody注解就可以获取到请求中的各个参数然后赋值到相对应的方法形参上,另外,当有一个实体类**User**包含了idname的元素的话,在方法里面直接可以写@requestBody User user就会自动封装好给我们使用的了,不用麻烦像这样@requestBody Integer id, @requestBody String name一个一个的封装

  1. //异步请求部分代码
  2. $.ajax({
  3.         url:"/hello",
  4.         type:"POST",
  5.         data:'{"id":"123","name":"chenyc"}',
  6.         content-type:"application/json charset=utf-8",
  7.         success:function(data){
  8.           alert(data);
  9.         }
  10.     });
  11. //@requestBody注解获取数据代码
  12. @requestMapping("/hello")
  13. public String hello(@requestBody Integer id,@requestBody String name){
  14. System.out.println("id:"+id+";"+"name:"+name);
  15. }