06、SpringBoot

对于SpringBoot总结起来就是,它可以快速、简单地整合所有技术栈。

一、特性

SpringBoot可以帮我们快速、简单地创建一个独立的生产级别的Spring应用。对于大多数SpringBoot应用只需要编写少量的配置就可以快速整合Spring平台及第三方的技术。

对于SpringBoot的特性总结起来有如下一些特性:

  • 快速创建独立Spring应用
  • 直接嵌入Tomcat、Jetty 、Undertow
  • 提供可选的starter,简化应用整合(starter指的就是场景启动器)
  • 按需自动配置Spring以及第三方库
  • 提供了一些生产级特性,如:监控指标、健康检查、外部化配置...
  • 无代码生成、无xml,都是基于自动配置技术实现的

关于SpringBoot的应用打包部署

对于JavaWeb的项目,我们把项目打包为一个war包,把这个war包放到Tomcat的webapps目录下。

对于SpringBoot的应用我们直接可以使用maven工具打包为一个jar包

最后打好的jar包会默认放在项目的target目录下,打出来的jar文件我们是可以自行修改文件名称的,比如我们会修改为:app.jar

此时我们要启动项目,只需要一个简单的命令:java -jar app.jar

如果我们在启动项目时需要修改项目的端口号,可以直接在启动命令后添加--server.port,如下所示:

java -jar app.jar --server.port=9999

注意:任意的配置文件中的配置项都可以像上面这样修改配置值,这对于临时修改配置是非常方便的!

关于场景启动器

前面我们说它的特性的时候,说到了starter就是指的场景启动器,这个可以理解为SpringBoot为我们提供的场景依赖。我们使用Spring Initializr向导创建项目的时候可以选择我们项目需要的场景,选择好后会自动在我们的pom.xml中看到引入了对应的spring-boot-starter-xxx 这些就是SpringBoot的场景启动器。

它有如下的一些特点:

  • 每个功能被SpringBoot抽取为一个场景,在这个场景中又为我们导入了一些需要的依赖
  • 场景启动器会把当前场景需要的所有jar包都引入进来
  • 每个场景启动器都会有一个基础依赖:spring-boot-starter
  • 如果是Spring官方提供的场景,命名为:spring-boot-starter-*
  • 如果是第三方提供的场景,命名为:*-spring-boot-starter

关于依赖管理

我们使用Spring提供的脚手架创建项目的时候,我们的pom.xml中是不用写版本号的,这是为什么呢?

因为每一个SpringBoot项目都有一个父项目:spring-boot-starter-parent,在这个父项目中还有一个父项目:spring-boot-dependencies,也就是在这个里面把所有的版本好都明确指定好了。所以在我们的项目中可以不用写版本号而是沿用爷爷项目中指定的版本。

我们在什么情况下要自己写版本号?

  • 情况一:父项目是没有管理我们需要的依赖,这个时候我们就只能自己写上具体的版本号了
  • 情况二:这种情况极少见,就是说你不想用Spring为我们指定的版本号非要自己指定(注意:Spring为我们指定的版本一定是经过验证的!!),这个时候可以在我们自己的项目中直接写上版本号(这个就是maven的就近优先)

二、自动配置

初步理解

我们项目中导入了场景,容器中就会自动配置好这个场景的核心组件。这个就是自动配置组件,当然如果自动配置的不喜欢是可以自行配置进行替换的。

如下示例,我们替换SpringBoot为我们提供的数据源为druid

第一步:pom文件中导入druid依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.23</version>
</dependency>

第二步:添加配置类向容器中注册一个DataSource的Bean

@Data
@Configuration
@ConfigurationProperties(prefix = "spring.datasource")  // 使用这种匹配的方式要提供setter方法
public class DataSourceConfig {

    // @Value("${spring.datasource.username}")
    private String username;
    // @Value("${spring.datasource.password}")
    private String password;
    // @Value("${spring.datasource.url}")
    private String url;
    // @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;


    @Bean
    DataSource  dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        System.out.println("username = " + username);
        System.out.println("password = " + password);
        System.out.println("url = " + url);
        System.out.println("driverClassName = " + driverClassName);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setUrl(url);
        dataSource.setDriverClassName(driverClassName);
        return dataSource;
    }
}

完成上面的两步后,后续使用数据源的时候就是使用的Druid数据源了。

对于数据源的替换还有一种方式直接在配置文件中指定数据源的类型,这样的话我们就连上面的配置类都不需要了

# 指定数据源的类型
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

所以总结下来替换组件的主式是:先看是否可以在配置文件中进行配置替换,如果可以则直接在配置文件中进行替换,如果不行的话就自己提供一个配置类注册一个自己创建的Bean进行替换。

默认规则

  1. 默认的包扫描规则:SpringBoot只会扫描主程序所在的包及其子名下的所有组件
  2. 配置文件中的很多配置是有默认值,如果不配置就会使用这个默认值,如果想修改就主动配置上新值即可

SpringBoot的默认约定:用户如果自己配置了则使用用户配置的,否则使用约定的默认配置

完整流程

我们在pom中导入了场景,其对应的组件都可以使用了,这个是如何实现的?是如何进行的自动配置的?

核心的流程如下:

  1. 导入starter,就会导入autoconfigure包
  2. autoconfigure包里面有一个文件META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,在这里指定了所有启动时要加载的自动配置类
  3. @EnableAutoConfiguration会自动把上面文件里写的所有自动配置类都导入进来。xxxAutoConfiguration是有条件注解进行按需加载
  4. xxxAutoConfiguration给容器导入一堆组件,组件都是从xxxProperties中提取的属性值
  5. xxxProperties又是与配置文件进行绑定的

最终的效果是:导入starter、修改配置文件就可以修改底层行为

 

三、基础使用

属性绑定@ConfigurationProperties

它用来把组件的属性值和配置文件中配置项的值进行绑定。

  • 给容器中注册组件,使用@Component,@Bean
  • 使用@ConfigurationProperties声明组件和配置文件的哪些配置项进行绑定
# 自定义配置项
dog.name=旺财
dog.age=2
dog.gender=男
@Component  // 它必须是组件
@ConfigurationProperties(prefix = "dog")    // 声明与哪些属性进行绑定
@Data
public class DogProperties {
    private String name;
    private Integer age;
    private String gender;

}

此时注册到容器中的组件doProperties的属性值就与对应的配置项保持一致了

注意:我们要保证DogProperties是容器中的组件,可以像上面这样使用@Component(常用),也可以使用@EnableConfigurationProperties来指定!

@EnableConfigurationProperties(DogProperties.class)
@SpringBootApplication
public class Springboot01DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springboot01DemoApplication.class, args);
    }

}

yaml配置文件

yaml配置文件的扩展名可以是.yml或者.yaml

spring:
  application:
    name: springboot-01-demo
  
  datasource:
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

yaml配置文件

  • 层次更加清晰
  • 同一层级要保证左对齐,下一层则在这个基础上使用空格表示
  • 配置项与配置值之间除了:号,记得还要在:后加上一个空格

yaml文件的基础语法:

  • 大小写敏感
  • 键值对写法k: v(注意::后有一个空格)
  • 使用缩进表示层次关系,缩进不可以使用tab键,只能使用空格,换行;缩进的空格数目是不限定的,但是要保证同一层左是左对齐的
  • #号表示是注释,从这个#后的这一行的所有字符都会被解析器忽略<
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值