Springboot项目固化依赖的那点事

 

 

前言:在正式理解parent元素之前,假定你已经阅读maven的聚合和继承详解这篇博客,对maven继承的原理有一定理解。众所周知,如果使用maven构建Springboot应用,那么pom文件中一般都会指定如下配置来引入Springboot,本文重点来了解下spring-boot-starter-parent下重点有哪些内容,然后探讨下如果当前应用已存在parent的前提下如何改造项目依然使用springboot功能

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.2.1.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

我们首先进入到artifactId为spring-boot-starter-parent的pom中,如下结构,我们会发现在这个父pom中并没有声明任何dependency,但也有一个artifactId为pring-boot-dependencies的父pom ,我们接下来进入这个父pom再次看一下

artifactId为pring-boot-dependencies的父pom结构如下,在箭头所指向的dependencyManagement定义了大约600个左右的依赖声明,。根据maven的聚合和继承详解讲解得知:父pom中的dependencyManagement只是起到一个声明的作用,并不会真正引入依赖,子pom按需在dependencies元素中引入即可。子pom实际引入几个,那么就会依赖几个;

通过如上两个图,可以得出一般的Springboot应用的maven继承关系:应用pom->spring-boot-starter-parent->spring-boot-dependencies,实际在spring-boot-dependencies提供了大量固化的依赖和插件,对于Springboot应用而言,只需要通过maven的parent元素继承Springboot官方提供的spring-boot-starter-parent即可。

对于Springboot应用中已存在parent的场景,Springboot官方推荐使用maven的dependencyManagement元素,类似如下配置来达成仍然使用Springboot提供依赖的目的。需要注意的是以下配置的作用只是将spring-boot-dependencies下的dependencyManagement中声明的依赖导入到当前pom的dependencyManagement中,dependencyManagement元素以外的内容不会导入,这个需要注意下;

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-dependencies</artifactId>
			<version>2.2.1.RELEASE</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

由于在spring-boot-starter-parent和spring-boot-dependencies中通过properties,dependencyManagement,pluginManagement等元素提供了大量固化的依赖和插件,推荐在子引用中直接使用parent元素继承即可。但在子应用已有parent且仍然想使用比如Springboot的依赖或者插件时,就需要单独编写配置,需要做如下改动:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>thinking-in-spring-boot</groupId>
    <artifactId>first-app-by-gui</artifactId>
    <version>0.0.1</version>
    <name>first-app-by-gui</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <resource.delimiter>@</resource.delimiter>
        <maven.compiler.source>${java.version}</maven.compiler.source>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>${java.version}</maven.compiler.target>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- 省略此处依赖 -->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.2.1.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

以下是推荐使用方式,大家可以对比下差异:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>thinking-in-spring-boot</groupId>
    <artifactId>first-app-by-gui</artifactId>
    <version>0.0.1</version>
    <name>first-app-by-gui</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <!-- 省略依赖内容 -->
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

总结:Springboot官方提供的artifactId:spring-boot-dependencies的pom,实际上提前定义了大量固化的依赖和插件,子应用通过maven的parent继承即可,本质还是利用Maven的继承特性;提供统一固化Maven依赖的好处是简化子应用使用Springboot框架开发项目的复杂度,统一管理依赖版本等来避免开发过程出错等!

以上,完了

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Redis 固化是指将 Redis 中的数据持久化到磁盘中,以便在 Redis 重启后能够恢复数据。Redis 提供了两种固化方式:RDB 和 AOF。RDB 是将 Redis 在某个时间点的数据快照保存到磁盘中,而 AOF 则是将 Redis 执行的每个写命令追加到一个文件中。关于如何实现 Redis 固化,可以通过配置 Redis 的持久化参数来实现。 ### 回答2: Redis固化是指将数据持久化存储到硬盘中,以防止服务异常或重启时数据丢失的情况。 Redis支持两种固化方式,分别为RDB(Redis DataBase)和AOF(Append Only File)。 RDB是将当前Redis内存中的数据保存到硬盘中的快照文件,通常以.rdb文件存储。该方式通过fork子进程进行数据的持久化操作,可以设置保存快照的触发条件,如设定时间间隔、写入的键值对数目等。RDB在恢复时,可选择全量还原数据或者只恢复特定时间点的数据。 AOF是将每一条对Redis的写入操作追加到AOF文件的末尾,该文件以追加的形式记录所有写命令,以恢复操作日志文件为基础。Redis启动时会回放AOF文件,将其中的写命令重新执行一遍,从而重建内存数据快照。AOF方式比RDB更加实时,数据更加安全,但对于较大的AOF文件和频繁写入操作的场景下,AOF的重放操作会消耗一定的时间。 Redis的持久化配置在redis.conf配置文件中进行设置,通过设置相应的参数来选择使用RDB还是AOF,或者同时使用两种方式。例如,设置save参数来控制RDB的触发条件,设置appendonly参数为yes来启用AOF方式。 总结来说,Redis的固化是通过将内存中的数据保存到硬盘中,以防止服务故障或重新启动时数据丢失。通过配置文件中的参数选择RDB或AOF或二者同时使用来实现持久化,并在恢复时重新加载数据。 ### 回答3: Redis 固化是指将 Redis 中的数据持久化到磁盘上,保证在重启或宕机后能够将数据恢复。Redis 提供了两种持久化方式:RDB(Redis Database)和AOF(Append-Only File)。 RDB 是将 Redis 数据以快照的形式保存到磁盘上,可以手动或定时触发快照操作。在快照过程中,Redis 会fork一个子进程,先将数据写入临时文件,然后替换原有的快照文件,保证原子性和最小化影响。RDB 的优势在于生成的快照文件较小,对恢复速度较快,适用于备份和全量恢复。 AOF 是将 Redis 的写命令以类似日志的方式追加到文件中,达到将数据库快速复制到硬盘的目的。AOF 文件记录了 Redis 所有的写操作,当 Redis 重启时,根据 AOF 文件重新构建数据库。AOF 能够提供更高的数据耐久性,但相比 RDB 会占用更多的磁盘空间和恢复时间长。 可以通过配置 Redis 的持久化选项来实现固化。针对 RDB,可以通过设置 save 或者 bgsave 参数来进行手动或者后台持久化。save 参数接收两个参数,第一个参数是时间间隔(单位秒),第二个参数是在指定时间内数据库中至少发生了多少次写操作。bgsave 命令是异步执行的,不会阻塞 Redis 主进程。 针对 AOF,可以通过设置 appendonly 参数开启 AOF 持久化功能。appendfsync 参数用于指定刷新磁盘的策略,有 always、everysec 和 no 三种,分别表示每个命令都刷新、每秒刷新和不刷新。其中 everysec 是较常用的选择,平衡了数据耐久性和性能。 总结来说,Redis 的持久化机制可以通过 RDB 和 AOF 来实现,在配置中设置相应的参数来控制持久化的行为和频率。这样,Redis 在发生故障或者重启时,都能够通过持久化文件来快速恢复数据,确保数据的安全性和持久性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值