草庐IT

day01-2-依赖管理和自动配置

liyuelian 2023-03-28 原文

依赖管理和自动配置

1.依赖管理

1.1什么是依赖管理

  1. spring-boot-starter-parent 中还有父项目,声明了开发中常用的依赖的版本号

  2. 并且进行自动版本仲裁,即如果程序员没有指定某个依赖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

介绍:

  1. 在开发中我们经常会用到spring-boot-starter-xxx,比如spring-boot-starter-web,该场景作用于web开发,也就是说xxx是某种开发场景
  2. 我们只要引入starter,这个场景的所有常规需要的依赖都能自动引入

2.3第三方starter

  1. SpringBoot也支持第三方starter
  2. 第三方starter不需要从spring-boot开始,因为这是官方spring-boot保留的命名方式。第三方启动程序通常以项目名称开头。例如,名为thirdpartyproject的第三方启动程序项目通常被命名为thirdpartyproject-spring-boot-starter
  3. 也就是说,xxx-spring-boot-starter是第三方为我们提供的简化开发的场景启动器

3.自动配置

3.1自动配置介绍

在SSM框架整合时,需要配置tomcat、配置SpringMVC、配置如何扫描包、配置字符过滤器、配置视图解析器、文件上传等,非常麻烦。而在SpringBoot中,存在自动配置机制,极大提高了开发效率。

3.2SpringBoot自动配置了哪些

  1. 自动配置了Tomcat

  2. 自动配置了SpringMVC

  3. 自动配置了Web的常用功能:比如字符过滤器,文件上传,视图解析器等等

  4. 自动配置:默认扫描包结构[官方文档],它会去扫描主程序所在的包及其子包下的所有文件,当然如果要扫描其他包也可以进行配置。

3.3如何修改默认配置

3.3.1修改默认扫描包结构

直接在主程序的注解中指定要扫描的包及其子包:

@SpringBootApplication(scanBasePackages = {"com.li","xx.yy","aa.bb"})

注意,scanBasePackages属性可以接收多个值。

3.3.2通过属性文件修改配置

SpringBoot项目最重要也是最核心的配置文件就是application.properties,所有的框架配置都可以在这个配置文件中说明。application.properties文件一般放在resources目录下。

application.properties配置大全

默认配置最终都是映射到某个类中,这个类最终也会被注入到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默认读取的路径有:

  1. 类路径:classpath:/
  2. 类路径的config目录下:classpath:/config/
  3. 项目根目录下:file:./
  4. 根目录的config目录的任何子级目录下:file:./config/*/
  5. 根目录的config目录下:file:./config/

也就是说如果我们把 application.properties 放在上述任意的目录下, 你会发现依然是管用的。

3.5自动配置遵守按需加载原则

3.5.1说明

  1. 自动配置遵守按需加载原则:也就是说,引入了哪个场景starter就会加载该场景关联的jar包,没有引入的starter则不会加载其关联的jar

  2. SpringBoot所有的自动配置功能都在spring-boot-autoconfigure包里面

  3. 在SpringBoot的自动配置包,一般是XxxAutoConfiguration.java,对应XxxProperties.java(XxxProperties.java又会从配置文件applicatio.properties中去读取设置,如果没有设置值,就保持默认值)

有关day01-2-依赖管理和自动配置的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - i18n Assets 管理/翻译 UI - 2

    我正在使用i18n从头开始​​构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在ruby​​onrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi

  3. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  4. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  7. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  8. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  9. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  10. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

随机推荐