references

    一般SpringBoot项目的结构

    • hello-world (项目名)
      • .idea
      • .mvn
      • src (存放代码的地方)
        • main
          • java
          • resources
            • static (存放静态文件:图片,css,js等等)
            • templates (存放模板文件:jsp,thymeleaf等等)
            • application.properties / yml (项目的配置文件)
        • test (存放测试文件)

    @SpringBootApplication 注解,包含

    • @EnableAutoConfiguration
    • @SpringBootConfiguration
    • @ComponentScan -> 默认扫描启动类所在包下所有的类

    SpringBoot的自动装配


    @PathVariable, @RequestParam, @RequestBody

    • @PathVariable 用于获得 url 中的路径参数
    • @RequestParam 用于获得url中的查询参数

      常见的路径参数和查询参数的例子:/klasses/{123456}/teachers?type=web

    • @RequestBody 用于获得通过 post 传递的 json 数据

      常见的 json 数据例子:{“userName”:”coder”,”fullName”:”shuangkou”,”password”:”123456”}


    读取配置文件中数据的注解(spring)

    • @Value(“${配置文件中的变量名}”)
    • @ConfigurationProperties(prefix = “配置文件中的前缀名”)
      • 使用 @ConfigurationProperties 的类同时要添加 @Component 注解
      • 如果不能添加 @Component 注解,那么可以在启动类添加 @EnableConfigurationPropertie(xxx.class) 来指明要自动设置值的类

    面试准备
    springboot 是什么

    • springboot 并不是对 spring 功能上的增强,而是提供了一种快速使用 spring 的方式
    • 为什么要使用 springboot
      • spring 的缺点:配置繁琐,引入依赖麻烦
      • springboot 的优点:
        • 在 springboot 推出之前,在开发过程中使用 spring 往往要进行大量的文件配置和引入依赖,而不同的依赖之间又会有不同版本的冲突。为了解决这些问题,springboot就诞生了,通过在 springboot 在不同的 starter 中定义了在不同的开发场景中要用到的 bean 实例,那么我们只要引入对应的 starter 包即可;而在其中的父项目,spring-boot-starter-parent 的 dependencyManagement 中定义一些依赖的版本,当我们在之后的项目中要引入依赖的时候,就会按照已经定义好的依赖版本去引入,解决了不同版本之间的冲突问题
        • 其中内嵌了 tomcat 服务器,使得只要将 springboot 项目打包成一个 jar 包就可以独立运行
        • 使得其他框架的使用更加简洁,例如如果要在Spring Boot中使用Mybat-Plus,只要导入他们开发的starter包就可以了

    什么是 starter?

    • 我的理解是 starter 是用于特定开发场景的依赖包,不同的 starter 包里面包含了该开发场景中常用的一些依赖。那么当我们要用到特定开发场景的功能的时候,就引入对应的 starter 就行,然后 maven 就会将该 starter 包含的其他包全部引入,就不需要我们独自将需要的依赖一个个分开引入了。
    • starter中会有一个@Configuration类,然后将该jar包所需要用到的bean对象都定义在这个配置类中,并且在META-INF/spring.factories中写入这个配置类,那么当spring boot项目启动的时候就会去扫描这个配置,同时一并将里面使用了@Bean注解的类实例化以及放入到IoC容器里面

    springboot 的核心注解:@SpringBootApplication

    • 该注解其实是三个注解:@SpringBootConfiguration、@EnableAutoConfiguration & @ComponentScan 的组合
    • @SpringBootConfiguration 的本质就是 @Configuration,其作用是用于标记配置类,允许在配置类中定义额外的 bean 实例
      • 其中 @Configuration 还可以更改 proxyBeanMethods 的值,true / false,用来设定配置类中 @Bean 返回的实例是单实例抑或是多实例
    • @ComponentScan,用于制定扫描的范围,位于扫面范围内的 bean 实例都会被扫描到容器内
    • @EnableAutoConfiguration
      • 该注解会加载 AutoConfigurationImportSelector 类,然后这个类最终会找到 spring-boot-autoconfigure jar 包中的 META-INF/spring.factories 文档,在这个文档中写有所有的 xxxAutoConfiguration 组件。在读取到这个内容之后,spring 就会按需来加载对应的 AutoConfiguration 配件
      • 每个 AutoConfiguration 类上一般都有 @ConditionalOnxxx 的注解,只有当注解的条件被满足了之后,该 AutoConfiguration 类才会被自动加载到容器之中;例如说 @ConditionalOnBean、@ConditionalOnMissingBean 等
    • reference:https://www.cnblogs.com/javaguide/p/springboot-auto-config.html( springboot 自动装配原理讲解)

    配置文件的优先级

    • properties > yml > yaml
    • 有优先级更高的配置文件中已定义的值,如果在优先级较低的配置文件中重复出现,就不会再次加载
    • 要注意 yml / yaml 中:1)数据值前面必须有空格,作为分隔符;2)使用缩进表示层级关系;3)缩进的空格数目不重要,只要同级的数据值左边对其即可
      • yml / yaml 中的数组,使用“-”表示数组的单个元素
      • ${key},参数引用

    springboot 中配置文件信息的读取

    • @Value:将注解 @Value(“${property}”) 加到要赋值的成员属性上
    • @ConfigurationProperties (prefix = “xxx”)
      • 被注解的类中的成员属性会自动匹配配置文件中名字一样的属性值
      • 不过使用该注解的前提是:1)被注解类已经加上了 @Component 或者其他注解(即被注解类是在 spring 容器中的);2)或者在配置类上使用 @EnableConfigurationProperties (xxx.classs) 来启动自动配置
    • spring 配置文件的加载也是有优先级的,具体的级别为:
      • config(在 src 外部的)内的 > resources 下的 config 文件夹内的 > 直接位于 resources 文件夹内的
    • reference:https://github.com/CodingDocs/springboot-guide/blob/master/docs/basis/read-config-properties.md

    @Controller & @RestController

    • @Controller 用于直接返回视图的项目中,属于前后端不分离
    • @RestController 会将结果封装在 JSON 中然后在返回,前端接受到结果之后再进一步处理,属于前后端分离

    question

    • maven-plugin 是为了把项目打包成 jar 包,直接在目标服务器执行即可?

    unsolved (注解)

    • 参数校验
      • JSR 提供的校验注解
      • Hibernate Validator 提供的校验注解
      • @RequestBody + @Valid
      • @Path Variables 和 @Request Parameters + @Valid 和 @Validated
      • 自定义的Validator
    • 处理Controller层异常
    • JPA相关
    • 事务:@Transactional
    • Json 数据处理
    • 测试相关