1、简介

Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。

人们把 Spring Boot 称为搭建程序的脚手架。其最主要作用就是帮我们快速的构建庞大的 Spring 项目,并且尽可能的减少一切 XML 配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。

2、优点

  • 创建独立运行的Spring应用程序
  • 可嵌入Tomcat,无需部署war文件
  • 简化maven配置
  • 自动配置Spring
  • 提供生产就绪型功能,如:日志,健康检查和外部配置等;
  • 不要求配置 XML;
  • 非常容易和第三方框架集成起来。

3、缺点

  • 版本更新快,可能出现较大的变化
  • 因为约定大于配置,所以经常会出现一些很难解决就的问题。

4、使用IDEA创建SpringBoot工程

08、SpringBoot入门简介-LMLPHP
08、SpringBoot入门简介-LMLPHP
08、SpringBoot入门简介-LMLPHP
08、SpringBoot入门简介-LMLPHP
08、SpringBoot入门简介-LMLPHP
08、SpringBoot入门简介-LMLPHP

5、初始化项目分析

1、spring-boot-starter-parent

Spring Boot 提供了一个名为 spring-boot-starter-parent 的工程,里面已经对各种常用依赖(并非全部)的版本进行了管理,我们的项目需要以这个项目为父工程,这样我们就不用操心依赖的版本问题了,需要什么依赖,直接引入坐标即可!

  • parent 项目中的 dependencyManagement 里的声明的依赖,只具有声明的作用,并不实现引入,因此子项目需要显式的声明需要用的依赖。
  • 如果子项目想要使用夫项目的依赖必须进行声明,否则不会继承下来。
  • 只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom;另外若子项目中指定了版本号,那么会使用子项目中指定的 jar 版本。

2、Spring Boot Starter

Spring Boot 非常优秀的地方在于提供了非常多以 spring-boot-starter-* 开头的开箱即用的 starter 启动器。

  • 官方常见的有一下几种:
  • spring-boot-starter:核心启动器,提供了自动配置,日志和 YAML 配置支持。
  • spring-boot-starter-aop:支持使用 Spring AOPAspectJ 进行切面编程。
  • spring-boot-starter-freemarker:支持使用 FreeMarker 视图构建 Web 应用。
  • spring-boot-starter-test:支持使用 JUnit,测试 Spring Boot 应用。
  • spring-boot-starter-web:支持使用 Spring MVC 构建 Web 应用,包括 RESTful 应用,使用 Tomcat 作为默认的嵌入式容器。
  • spring-boot-starter-actuator:支持使用 Spring Boot Actuator 提供生产级别的应用程序监控和管理功能。
  • spring-boot-starter-logging:提供了对日志的支持,默认使用 Logback。

3、Web 启动器

这是 SpringBoot 提供的 Web 启动器,是一个快速集成 Web 模块的工具包,包含 Spring MVC,Jackson 相关的依赖,以及嵌入了 Tomcat9 服务器,默认端口 8080。

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

4、打包插件

<!-- pom.xml 中添加插件 -->
<build>
    <plugins>
        <!-- Spring Boot 打包插件 -->
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

6、SpringBoot参数配置

1、application.properties语法

// 修改端口号
server.port=80
// 设置session的失效时间
server.session-timeout=30
// 设置tomcat的字符集
server.tomcat.uri-encoding=UTF-8
// 设置数据库相关
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/rbac
spring.datasource.username=root 
spring.datasource.password=admin

2、application.yml 语法

server:  
  port: 80
  session-timeout: 30  
  tomcat.uri-encoding: UTF-8  
  
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/crm  
    username: root  
    password: admin  
    driverClassName: com.mysql.jdbc.Driver

3、配置优先级

一个项目中可以有多个配置文件存放在不同目录中,此时他们会遵循固定的优先级来处理有冲突的属性配置,优先级由高到底,高优先级的配置会覆盖低优先级的配置。
由高到低的配置如下:

  • 项目/config/application.properties
  • 项目/application.properties
  • classpath:config/application.properties
  • classpath:application.properties

7、参数绑定

1、参数配置在自定义的 properties

# db.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/rbac
jdbc.username=root
jdbc.password=admin

2、xml方式加载

<context:property-placeholder location="classpath:db.properties" system-properties-mode="NEVER"/>

3、使用JavaConfig配置

/**
 *  @PropertySource:把属性配置加载到 Spring 的环境对象中
 *  @Value:从 Spring 环境对象中根据 key 读取 value
 */
@Configuration
@PropertySource("classpath:db.properties")
public class JavaConfig {
    @Value("${jdbc.driverClassName}")
    private String driverClassName;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;

    @Bean
    public MyDataSource dataSource() {
        MyDataSource dataSource = new MyDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

4、参数配置在 application.properties

1、准备好 application.properties 和一个类 MyDataSource

# application.properties
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/crm
jdbc.username=root
jdbc.password=admin
@Data
public class MyDataSource {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
}

2、@Value 绑定单个属性

  • 在自定义类上绑定
@Component
@Data
public class MyDataSource {
    @Value("${jdbc.driverClassName}")
    private String driverClassName;
    @Value("${jdbc.url}")
    private String url;
    @Value("${jdbc.username}")
    private String username;
    @Value("${jdbc.password}")
    private String password;
}
  • 配置类
@Configuration 
@ComponentScan("上面类所在的包路径")
public class JavaConfig { }

3、@ConfigurationProperties 绑定对象属性

若觉得上面的方式比较笨重,可以把前缀编写到 @ConfigurationProperties 属性上,并且设置类属性与需要绑定的参数名相同,可实现自动绑定,但是注意,若是使用测试类加载贴有 @Configuration 的配置类,则需要在配置类中添加 @EnableConfigurationProperties 注解;若是使用测试类加载贴有 @SpringBootApplication 的配置类,则不需要。

@Component
@ToString
@Setter
@ConfigurationProperties(prefix="jdbc")
public class MyDataSource {
    private String driverClassName;
    private String url;
    private String username;
    private String password;
}


@Bean
@ConfigurationProperties("jdbc")
public MyDataSource dataSource() {
    return new MyDataSource();
}

4、使用 Spring 的 Environment 对象绑定属性

@Configuration
@PropertySource("classpath:db.properties")
public class JavaConfig {
    /**
     * environment:表示 Spring 的环境对象,该对象包含了加载的属性数据
     * 可以获取到 application.properties 里面的参数,也可以获取到 @PropertySource 中的参数
     * 但 application.properties 的优先级比 @PropertySource 高
     */
    @Autowired
    private Environment environment;

    @Bean
    public MyDataSource dataSource() {
        MyDataSource dataSource = new MyDataSource();
        dataSource.setDriverClassName(environment.getProperty("jdbc.driverClassName"));
        dataSource.setUrl(environment.getProperty("jdbc.url"));
        dataSource.setUsername(environment.getProperty("jdbc.username"));
        dataSource.setPassword(environment.getProperty("jdbc.password"));
        return dataSource;
    }
}
12-08 09:00