springboot

什么是SpringBoot?

随着 Spring 不断的发展,涉及的领域越来越多,项目整合开发需要配合各种各样的文件,慢慢变得不那么易用简单,违背了最初的理念,甚至人称配置地狱

Spring Boot 正是在这样的一个背景下被抽象出来的开发框架,目的为了让大家更容易的使用 Spring 、更容易的集成各种常用的中间件、开源软件

Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序

也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用

简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架

Spring Boot的主要优点:

  • 为所有Spring开发者更快的入门
  • 开箱即用,提供各种默认配置来简化项目配置
  • 内嵌式容器简化Web项目
  • 没有冗余代码生成和XML配置的要求

原理

分析 pom.xml

spring-boot-starter-parent:包含配置文件,核心依赖版本由父工程管理

SpringBoot将一个个功能场景都变成了启动器 starter,需要什么功能只需要导入相应的启动器就行了!


分析 @SpringBootApplication

// @SpringBootApplication 标注这个类是一个SpringBoot应用
@SpringBootApplication 
public class Demo1Application {

    // 以为是启动了一个方法,没想到是启动了一个服务
    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }

}

结论:SpringBoot所有的自动配置都是在启动的时候扫描并加载,spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的starter,就有对应的启动器了,自动装配就会生效,然后就配置成功了

  1. SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值
  2. 将这些值作为自动配置类导入容器 , 自动配置类就生效 , 帮我们进行自动配置工作;
  3. 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的 jar 包中;
  4. 它会给容器中导入非常多的自动配置类 (xxxAutoConfiguration), 就是给容器中导入这个场景需要的所有组件 , 并配置好这些组件 ;
  5. 有了自动配置类 , 免去了我们手动编写配置注入功能组件等的工作;

分析 SpringApplication.run

  1. 推断应用的类型是普通的项目还是Web项目
  2. 查找并加载所有可用初始化器 , 设置到 initializers 属性中
  3. 找出所有的应用程序监听器,设置到 listeners 属性中
  4. 推断并设置 main 方法的定义类,找到运行的主类

yaml配置

  • application.properties,语法结构:key=value
  • application.yml,语法结构:key:空格value

yaml:"YAML Ain't a Markup Language"

与xml对比,yaml以数据为中心,而不是以标记语言为重点

编写一个Person类

@Component //注册bean到容器中
@ConfigurationProperties(prefix = "person") //注入yaml中的配置,默认从全局配置文件中获取
@PropertySource(value = "classpath:person.properties") //我们也可以从指定加载的配置文件中注入
public class Person {
    @Value("${person.name}") //从person.properties中注入
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    
    //有参无参构造、get、set方法、toString()方法  
}

配置yaml

person:
  name: qinjiang
  age: 3
  happy: false
  birth: 2000/01/01
  maps: {k1: v1,k2: v2}
  lists:
   - code
   - girl
   - music
  dog:
    name: 旺财
    age: 1

@Value对比:

  1. @ConfigurationProperties 只需要写一次即可 , @Value则需要每个字段都添加
  2. 松散绑定:这个什么意思呢?比如我的 yml 中写的 last-name,这个和 lastName 是一样的, - 后面跟着的字母默认是大写的,这就是松散绑定
  3. JSR303 数据校验 , 这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性
  4. 复杂类型封装,yml中可以封装对象,使用 @Value 就不支持

结论:

配置yml 和配置properties 都可以获取到值,强烈推荐 yml

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value

如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@ConfigurationProperties,不要犹豫!


实现自定义配置

每一个xxxAutoConfiguration类都是容器中的一个组件,最后都加载到容器中,它们会与一个xxxProperties类绑定,而这个类又会通过@ConfigurationProperties与我们的配置对应,这样就实现了自定义配置

通过设置debug: true可以查看哪些自动配置类生效了


参考

【狂神说SpringBoot】

posted @ 2022-11-22 17:08  黄一洋  阅读(7)  评论(0)    收藏  举报