1.依赖管理
1.1什么是依赖管理
-
spring-boot-starter-parent 中还有父项目,声明了开发中常用的依赖的版本号
-
并且进行自动版本仲裁,即如果程序员没有指定某个依赖jar的版本,则以父版本指定的版本为准
1.2修改自动仲裁/默认版本号
比如我们要将SpringBoot的 mysql 驱动版本改为 5.1.49(默认版本为8.0.26),有两种方法:
(1)方式一:在pom.xml文件中显式的导入mysql依赖,并指定version
<!--自己指定mysql的驱动版本--> | |
<dependency> | |
<groupId>mysql</groupId> | |
<artifactId>mysql-connector-java</artifactId> | |
<version>5.1.49</version> | |
</dependency> |
(2)方式二:在pom.xml文件的< properties>节点中指定mysql的 key,形如:
<properties> | |
<mysql.version>5.1.49</mysql.version> | |
</properties> | |
<dependency> | |
<groupId>mysql</groupId> | |
<artifactId>mysql-connector-java</artifactId> | |
</dependency> |
为什么能够达到修改版本仲裁的效果?
答:根据依赖就近优先原则。比如pom.xml文件不断的应用依赖,形成了一个依赖树,那么项目依赖jar的版本以离本项目最近的版本为准。如果本项目没有指定该jar的版本,就以离本项目最近的父项目的版本为准。
2.starter场景启动器
2.1starter场景启动器基本介绍
(1)开发中我们引入了相关场景的starter,这个场景中所有的相关依赖都引进来来,比如我们做web开发引入了spring-boot-starter-web,该starter将导入所有与web开发相关的所有包
(2)依赖树:可以看到spring-boot-starter-web帮我们引入了spring-webmvc,spring-web开发模块,还引入了spring-boot-starter-tomcat场景,spring-boot-starter-json场景,这些场景下面又引入了一大堆相关的包,这些依赖项可以快速启动和运行一个项目,提高开发效率。
(3)所有场景启动器最基本的依赖就是spring-boot-starter,从前面的依赖树可以看到这个依赖是SpringBoot自动配置的核心依赖
2.2官方提供的starter
官方文档:Developing with Spring Boot
介绍:
- 在开发中我们经常会用到spring-boot-starter-xxx,比如spring-boot-starter-web,该场景作用于web开发,也就是说xxx是某种开发场景
- 我们只要引入starter,这个场景的所有常规需要的依赖都能自动引入
2.3第三方starter
- SpringBoot也支持第三方starter
- 第三方starter不需要从spring-boot开始,因为这是官方spring-boot保留的命名方式。第三方启动程序通常以项目名称开头。例如,名为thirdpartyproject的第三方启动程序项目通常被命名为thirdpartyproject-spring-boot-starter
- 也就是说,xxx-spring-boot-starter是第三方为我们提供的简化开发的场景启动器
3.自动配置
3.1自动配置介绍
在SSM框架整合时,需要配置tomcat、配置SpringMVC、配置如何扫描包、配置字符过滤器、配置视图解析器、文件上传等,非常麻烦。而在SpringBoot中,存在自动配置机制,极大提高了开发效率。
3.2SpringBoot自动配置了哪些
-
自动配置了Tomcat
-
自动配置了SpringMVC
-
自动配置了Web的常用功能:比如字符过滤器,文件上传,视图解析器等等
-
自动配置:默认扫描包结构[官方文档],它会去扫描主程序所在的包及其子包下的所有文件,当然如果要扫描其他包也可以进行配置。
3.3如何修改默认配置
3.3.1修改默认扫描包结构
直接在主程序的注解中指定要扫描的包及其子包:
@SpringBootApplication(scanBasePackages = {"com.li","xx.yy","aa.bb"})
注意,scanBasePackages属性可以接收多个值。
3.3.2通过属性文件修改配置
SpringBoot项目最重要也是最核心的配置文件就是application.properties,所有的框架配置都可以在这个配置文件中说明。application.properties文件一般放在resources目录下。
默认配置最终都是映射到某个类中,这个类最终也会被注入到spring的容器中。
配置properties-->配置属性Bean-->Spring容器
例子:
#修改server的监听端口 默认为8080 | |
server.port=10000 | |
#修改单个文件上传的默认最大值 默认为1MB | |
#multipart.max-file-size属性可以指定SpringBoot上传文件的大小限制 | |
#默认配置最终都是映射到某个类中! | |
#比如multipart.max-file-size会映射到MultipartProperties类上 | |
#将光标放在该属性,输入ctrl+b,就可以定位这个属性是关联到哪个属性类上的 | |
spring.servlet.multipart.max-file-size=10MB |
3.3.3application.properties常用配置
#端口号 | |
server.port=10000 | |
#应用的上下文路径(项目路径) | |
server.servlet.context-path=/allModel | |
#指定 POJO 扫描包来让 mybatis 自动扫描到自定义的 POJO | |
mybatis.type-aliases-package=com.cxs.allmodel.model | |
#指定 mapper.xml 的路径: | |
#application 上配置了@MapperScan(扫描mapper类的路径)和 pom.xml 中放行了 mapper.xml后, | |
#配置mapper-locations没有意义。如果mapper类和 mapper.xml不在同一个路径下时,mapper-locations就有用了 | |
mybatis.mapper-locations=classpath:com/cxs/allmodel/mapper | |
#session 失效时间(单位 s) | |
spring.session.timeout=18000 | |
#数据库连接配置 | |
#mysql 数据库 url | |
mysql.one.jdbc-url=jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useSSL=false | |
#mysql 数据库用户名 | |
mysql.one.username= | |
#数据库密码 | |
mysql.one.password= | |
#线程池允许的最大连接数 | |
mysql.one.maximum-pool-size=15 | |
#日志打印: | |
#日志级别 trace<debug<info<warn<error<fatal 默认级别为 info,即默认打印 info 及其以上级别的日志 | |
#logging.level 设置日志级别,后面跟生效的区域,比如 root 表示整个项目,也可以设置为某个包下,也可以具体到某个类名(日志级别的值不区分大小写) | |
logging.level.com.cxs.allmodel.=debug | |
logging.level.com.cxs.allmodel.mapper=debug | |
logging.level.org.springframework.web=info | |
logging.level.org.springframework.transaction=info | |
logging.level.org.apache.ibatis=info | |
logging.level.org.mybatis=info | |
logging.level.com.github.pagehelper = info | |
logging.level.root=info | |
#日志输出路径 | |
logging.file=/tmp/api/allmodel.log | |
#配置 pagehelper 分页插件 | |
pagehelper.helperDialect=mysql | |
pagehelper.reasonable=true | |
pagehelper.supportMethodsArguments=true | |
pagehelper.params=count=countSql | |
#jackson 时间格式化 | |
spring.jackson.serialization.fail-on-empty-beans=false | |
#指定日期格式,比如 yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名 | |
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss | |
#指定日期格式化时区,比如 America/Los_Angeles 或者 GMT+10 | |
spring.jackson.time-zone=GMT+8 | |
#设置统一字符集 | |
spring.http.encoding.charset=utf8 | |
#redis 连接配置 | |
# redis 所在主机 ip 地址 | |
spring.redis.host= | |
#redis 服务器密码 | |
spring.redis.password= | |
#redis 服务器端口号 | |
spring.redis.port= | |
#redis 数据库的索引编号(0 到 15) | |
spring.redis.database=14 | |
# 连接池的最大活动连接数量,使用负值无限制 | |
spring.redis.pool.max-active=8 | |
# 连接池的最大空闲连接数量,使用负值表示无限数量的空闲连接 | |
spring.redis.pool.max-idle=8 | |
# 连接池最大阻塞等待时间,使用负值表示没有限制 | |
spring.redis.pool.max-wait=-1ms | |
# 最小空闲连接数量,使用正值才有效果 | |
spring.redis.pool.min-idle=0 | |
# 是否启用 SSL 连接. | |
spring.redis.ssl=false | |
# 连接超时,毫秒为单位 | |
spring.redis.timeout= 18000ms | |
# 集群模式下,集群最大转发的数量 | |
spring.redis.cluster.max-redirects= | |
# 集群模式下,逗号分隔的键值对(主机:端口)形式的服务器列表 | |
spring.redis.cluster.nodes= | |
# 哨兵模式下,Redis 主服务器地址 | |
spring.redis.sentinel.master= | |
# 哨兵模式下,逗号分隔的键值对(主机:端口)形式的服务器列表 | |
spring.redis.sentinel.nodes= 127.0.0.1:5050,127.0.0.1:5060 |
3.3.4application.properties自定义配置
我们还可以在properties文件中自定义配置,通过@Value("${}")
获取对应属性值
例子:
(1)application.properties 文件
my.website=https://www.baidu.com |
(2)某个 Bean
@Value("${my.website}") | |
private String bdUrl;//从application.properties中获取value值 |
3.4SpringBoot在哪里读取application.properties配置
(1)打开ConfigFileApplicationListener.java,看一下源码
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/"; |
可以看到SpringBoot默认读取的路径有:
- 类路径:
classpath:/
- 类路径的config目录下:
classpath:/config/
- 项目根目录下:
file:./
- 根目录的config目录的任何子级目录下:
file:./config/*/
- 根目录的config目录下:
file:./config/
也就是说如果我们把 application.properties 放在上述任意的目录下, 你会发现依然是管用的。
3.5自动配置遵守按需加载原则
3.5.1说明
-
自动配置遵守按需加载原则:也就是说,引入了哪个场景starter就会加载该场景关联的jar包,没有引入的starter则不会加载其关联的jar
-
SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包里面
-
在SpringBoot的自动配置包,一般是XxxAutoConfiguration.java,对应XxxProperties.java(XxxProperties.java又会从配置文件applicatio.properties中去读取设置,如果没有设置值,就保持默认值)