SpringBoot

一、配置

为什么依赖不需要声明版本?

  • parent的父项目是spring-boot-dependencies
  • 父项目版本仲裁中心,即,spring-boot-dependencies,把所有常见的jar的依赖版本都声明好了

SpringBoot配置文件

配置文件必须放置在项目的类加载目录下, 并且名字必须是application开头的

一些约定配置在里面的,比如server.port:8080配置在application-spring-configuration-metadata.json

在代码中获取配置文件属性,通过spring

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.penghu.springboot3;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class DataSourceProperties {

@Value("${spring.jdbc.datasource.driverClassName}")
private String driverClassName;

@Value("${spring.jdbc.datasource.url}")
private String url;

@Value("${spring.jdbc.datasource.username}")
private String username;

@Value("${spring.jdbc.datasource.password}")
private String password;

//省略get set 和 toString方法

@Override
public String toString() {
return "DataSourceProperties{" +
"driverClassName='" + driverClassName + '\'' +
", url='" + url + '\'' +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
yaml配置文件

连续的项目通过减号 “ - ” 来表示(理解为数组的第一个元素用“ - ”)

多环境切换

如果properties和yml文件都存在,如果有重叠属性,默认以properties优先。

二 SpringBoot原理

概述

SpringBoot只会扫描主程序所在的包及其下面的子包,自动的component-scan功能

  • 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。

  • 导入哪个场景就开启哪个自动配置

    • 比如,导入场景spring-boot-starter-web

    • 每个场景启动器都引入了一个spring-boot-starter,核心场景启动器。

    • 3、核心场景启动器引入了spring-boot-autoconfigure包。

    • 4、spring-boot-autoconfigure里面囊括了所有场景的所有配置。

场景启动器

1
2
spring-boot-starter-*	官方的
*-spring-boot-starter 第三方

主程序@SpringBootApplication

  • 每个场景启动器都引入了一个spring-boot-starter,核心场景启动器。
  • 核心场景启动器引入了spring-boot-autoconfigure包。
  • spring-boot-autoconfigure里面囊括了所有场景的所有配置。
  • SpringBoot默认却扫描不到 spring-boot-autoconfigure下写好的所有配置类。(这些配置类给我们做了整合操作)。

@SpringBootApplication由三个注解组成@SpringBootConfiguration@EnableAutoConfiguratio@ComponentScan

3个注解解析

1、@EnableAutoConfiguration:SpringBoot 开启自动配置的核心

利用@Import 批量导入组件机制,把 autoconfigure 包下的142 xxxxAutoConfiguration类导入进来(自动配置类),按需控制,由条件注解@ConditionalOnxxx控制

1的延申。xxxxAutoConfiguration自动配置类的衍生

  • 1、给容器中使用@Bean 放一堆组件。
  • 2、每个自动配置类都可能有这个注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中配的指定前缀的属性值封装到 xxxProperties属性类
  • 3、以DataSourceAutoConfiguration为例:所有配置都是以spring.datasource开头的,配置都封装到了属性类中。
  • 4、给容器中放的所有组件的一些核心参数,都来自于xxxPropertiesxxxProperties都是和配置文件绑定的。
  • 只需要改配置文件的值,核心组件的底层参数都能修改

2、@SpringBootConfiguration。就是: @Configuration,标记当前类为配置类

3、‌**@ComponentScan**。

组件扫描:排除一些组件(哪些不要)

排除前面已经扫描进来的配置类、和自动配置类

springboot核心流程总结:

1、导入starter,就会导入autoconfigure包。

2、autoconfigure 包里面有一个文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类

3、@EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来。xxxAutoConfiguration 是有条件注解进行按需加载

4、xxxAutoConfiguration给容器中导入一堆组件,组件都是从 xxxProperties中提取属性值

5、xxxProperties又是和配置文件进行了绑定

**效果:**导入starter、修改配置文件,就能修改底层行为。

三、SpringBoot自定义启动器

1 web相关配置5个重要参数

1.端口号

server.port

server.servlet.context-path`: 设置应用程序的上下文路径。

3、

spring.mvc.view.prefixspring.mvc.view.suffix: 这两个属性用于配置视图解析器的前缀和后缀。spring.mvc.view.prefix定义视图的前缀,spring.mvc.view.suffix定义视图的后缀。

4、

spring.resources.static-locations: 配置静态资源的位置。默认情况下,Spring Boot会将静态资源放在classpath:/static目录下。您可以通过在配置文件中设置spring.resources.static-locations属性来自定义静态资源的位置。

1
2
3
4
spring:
web:
resources:
static-locations: classpath:/webapp/

5、

spring.http.encoding.charsetspring.http.encoding.enabled

这两个属性用于配置HTTP请求和响应的字符编码。spring.http.encoding.charset定义字符编码的名称(例如UTF-8),spring.http.encoding.enabled用于启用或禁用字符编码的自动配置。

2、静态资源目录

· classpath:/META-INF/resources/

· classpath:/resources/

· classpath:/static/

· classpath:/public/

习惯会把静态资源放在classpath:/static/ 目录下。在resources目录下创建index.html文件

3 定时任务

依赖

1
2
3
4
5
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>

这部分略了

4 整合Druid数据源,没成功

druid的配置文件看一下

5 SpringBoot项目打包

在Spring Boot项目中添加spring-boot-maven-plugin插件是为了支持将项目打包成可执行的可运行jar包。如果不添加spring-boot-maven-plugin插件配置,使用常规的java -jar命令来运行打包后的Spring Boot项目是无法找到应用程序的入口点,因此导致无法运行。

1
2
3
4
5
6
7
8
9
<!--    SpringBoot应用打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

java -jar命令用于在Java环境中执行可执行的JAR文件。下面是关于java -jar命令的说明:

命令格式:java -jar [选项] [参数] <jar文件名>

  1. -D<name>=<value>:设置系统属性,可以通过System.getProperty()方法在应用程序中获取该属性值。例如:java -jar -Dserver.port=8080 myapp.jar
  2. -X:设置JVM参数,例如内存大小、垃圾回收策略等。常用的选项包括:
    • -Xmx<size>:设置JVM的最大堆内存大小,例如 -Xmx512m 表示设置最大堆内存为512MB。
    • -Xms<size>:设置JVM的初始堆内存大小,例如 -Xms256m 表示设置初始堆内存为256MB。
  3. -Dspring.profiles.active=<profile>:指定Spring Boot的激活配置文件,可以通过application-<profile>.propertiesapplication-<profile>.yml文件来加载相应的配置。例如:java -jar -Dspring.profiles.active=dev myapp.jar

6 组件添加

1 @Configuration详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 配置类里面使用@Bean标注在方法上,给容器注册组件,默认也是单实例的
* proxyBeanMethods = true,解决组件依赖问题
*/
@Configuration(proxyBeanMethods = true) //告诉springboot这是一个配置类
public class Myconfig {

@Bean //给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型
public User user01(){
return new User("zhangsan",22);
}

@Bean("tom") //也可以手动给组件改id
public Pet tomPet(){
return new Pet("tomcat");
}
}

2 @Import(User.class)

​ 给容器自动创建出对应类型的组件

​ 默认组件名字就是全类名

3 @ImportResource(“classpath:beans.xml”)

​ 导入Spring配置文件

4 配置绑定

方式1:

​ @Component

​ @ConfigurationProperties(prefix=”mycar”)

类里面的xxx属性,可以获得配置文件里的mycar.xxx的值

方式2:

​ 前提:必须在配置类中写

开启属性配置功能方式1:

​ @Component

​ @ConfigurationProperties(prefix=”mycar”)

开启属性配置功能方式2(一般用这种):

​ @EnableConfigurationProperties(Car.class)

​ 另一个作用:把指定的组件自动注册到容器中

四 最佳实践

1 引入场景自动配置

​ 配置文件中debug=true,开启自动配置报告,看哪些生效,哪些不生效