ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

SpringBoot入门:依赖冲突的解决方案详解

2021-06-10 14:54:44  阅读:206  来源: 互联网

标签:SpringBoot 配置文件 spring 代码 springframework 详解 复制 org 入门


SpringBoot Maven补充 依赖冲突 什么是依赖冲突

场景:

  1. spring-webmvc、spring-jdbc 都依赖 spring-beans
  2. spring-webmvc 的版本是5.2.8,那么它依赖的 spring-beans 的版本也是5.2.8
  3. spring-jdbc 的版本是5.2.6,那么它依赖的 spring-beans 的版本也是5.2.6

如果 spring-jdbc 和 spring-webmvc 放到一起,那么就会出现两个版本的 spring-beans ,这样就产生了依赖冲突,那么久需要想办法只保留一个版本的 spring-beans

依赖冲突的解决方案①

默认情况下,优先保留前面先声明的版本

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>
复制代码
依赖冲突的解决方案②

单独为依赖库添加 dependency 指定版本

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>
复制代码
依赖冲突的解决方案③

使用 exclusion 排除某个依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.8.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.6.RELEASE</version>
</dependency>
复制代码
依赖冲突的解决方案④(推荐)

使用 dependencyManagement 锁定依赖库的版本号

  • 注意: dependencyManagement 只是声明版本号,并不会触发下载依赖导入依赖库
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.2.8.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>
复制代码
自定义属性
<properties>
    <!-- 定义版本号 -->
    <spring.version>5.2.8.RELEASE</spring.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
    </dependency>
</dependencies>
复制代码
分模块构建项目

当项目规模比较庞大时,可以考虑对项目进行拆分,分模块进行构建项目

  • 两种常见思路按业务模块:员工模块、部门模块、工资模块等按层:dao层、service层、web层等

分模块后,由于项目结构看起来会复杂一点,建议隐藏一些不常用的文件或者文件夹

继承

子项目继承父项目后,可以继承父项目的 pom.xml 文件中的一些内容

  • 比如 dependencies 、 dependencyManagement 、 properties
<!-- 项目的坐标 -->
<groupId>com.prger</groupId>
<artifactId>39_parent</artifactId>
<version>1.0-SNAPSHOT</version>

<!-- 作为父项目,packaging必须是pom -->
<packaging>pom</packaging>

复制代码
<!-- 子项目通过parent标签继承父项目 -->
<parent>
    <artifactId>39_parent</artifactId>
    <groupId>com.prger</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>
复制代码
聚合

可以通过 module 标签聚合多个项目,可以对多个项目进行统一构建管理

<!-- 聚合 -->
<modules>
    <module>dao</module>
    <module>service</module>
    <module>web</module>
</modules>
复制代码
依赖

一个项目A可以使用 dependency 依赖另一个项目B

  • 项目A中可以直接拥有项目B的 classpath 中的内容(比如类、配置文件、依赖库等)
<!-- web项目依赖service项目 -->
<artifactId>web</artifactId>
<packaging>war</packaging>

<dependencies>
    <dependency>
        <groupId>com.prger</groupId>
        <artifactId>service</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
</dependencies>
复制代码
SpringBoot简介
  • 解决问题SpringBoot 的存在可以解决JavaEE开发中存在的 配置繁多 、 部署复杂 、 集成第三方库麻烦等问题
  • SpringBoot的特点内置了很多常用的配置,让JavaEE开发更加简单项目可以独立运行,无须额外依赖web容器(内置了web容器)
SpringBoot入门 第一个SpringBoot项目 pom.xml的配置
<!-- 全局配置(比如版本信息) -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.4.RELEASE</version>
</parent>

<!-- 依赖 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
复制代码
controller
@RestController
public class TestController {

    @GetMapping("/test")
    public String test(){
        return "hello SpringBoot";
    }
}
复制代码
程序的入口

Application.java 文件要跟 controller文件夹 同一级别

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
复制代码
@SpringBootApplication

@SpringBootApplication 包含了如下三个注解

  • @EnableAutoConfiguration可以根据maven依赖自动构建相关环境(比如spring-boot-starter-web构建web容器环境等)
  • @ComponentScan默认会扫描当前包以及子包的所有类
  • @SpringBootConfiguration
可运行jar

如果希望通过 mvn package 打包出一个可运行的jar,需要添加一个插件

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.3.4.RELEASE</version>
        </plugin>
    </plugins>
</build>
复制代码
热部署

Debug模式下,它可以监控 classespath 的变化

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
复制代码
SpringBoot配置文件 应用程序配置文件(Application Property Files)

SpringBoot 默认回去加载一个应用程序配置文件,文件名为 application

对于 application 配置文件的存放位置,项目在进行加载时也是有先后之分的(安装优先级从高到低排序)

//file:./表示项目的根路径
file:./config/
file:./config/*/
file:./
classpath:/config/
classpath:/
复制代码

运行参数、VM选项

可以通过运行参数或者VM选项,指定配置文件的文件名、位置

通过上述配置程序又是如何得到这些参数的呢?

在项目的程序入口 main方法 的 args参数 中获取

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
复制代码
配置文件的内容
#设置端口号
server.port=8888
#设置context-path
server.servlet.context-path=/cfg
复制代码
  • 关于服务器的配置内容参考spring-boot-autoconfigure.jar/META-INF/spring.factoriesServletWebServerFactoryAutoConfigurationServerProperties
application配置文件

application配置文件的内容可以直接通过 @Value 进行注入,无须向之前学习的SpringMVC中使用 @PropertySource 注解

name=prger
nums=11,22,33
homes={'11': '111', '22': '222'}
复制代码
@Value("${name}")
private String name;
@Value("${nums}")
private List<Integer> nums;
@Value("#{${homes}}")
private Map<String, String> homes;
复制代码
YAML

YAML可以用来做配置文件,在SpringBoot中,更推荐使用YAML作为配置文件,文件扩展名为 .yml

server:
	port:8888
	servlet:
		context-path:/prger
复制代码

YAML使用空格或TAB作为层级缩进

冒号:与后面紧跟的内容之间 必须 要有空格或者TAB

字符串可以不用加引号。如果有转义字符,可以使用双引号括住字符串

属性绑定(JavaBean properties binding)

使用注解 @ConfigurationProperties 进行属性绑定

#application.yml
student:
  name: prger
  hobbies: [足球, 篮球]
  numbers: [25, 9, 10]
  jobs:
    - 程序员
    - 厨师
  homes:
    - sz: 坪洲
  dog:
    age: 2
    name: Tom
  books:
    - price: 10.1
      name: iOS
    - price: 22.2
      name: Java
复制代码
@Component
@ConfigurationProperties("student")
@Data
public class Student {
    private String name;
    private List<String> hobbies;
    private Set<Integer> numbers;
    private String[] jobs;
    private Map<String, String> homes;
    private Dog dog;
    private List<Book> books;

    @Data
    public static class Dog {
        private Integer age;
        private String name;
    }

    @Data
    public static class Book {
        private Double price;
        private String name;
    }
}
复制代码

为了更加快捷地完成绑定工作,可以添加以下两个依赖

<!-- 在编译期间帮助生成Getter、Setter等代码 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
</dependency>

<!-- 配置文件属性名提示 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

复制代码
拆分配置文件

当application配置文件的内容过多时,可以通过 --- 将配置文件拆分成多个文档

#加载指定的文档
spring:
  profiles:
    active: dev
---
jdbc:
  url: jdbc:mysql://localhost:3306/test
  username: root1
  password: root1
# 设置文档名称
spring:
  profiles: dev
---
jdbc:
  url: jdbc:mysql://localhost:3306/test
  username: root2
  password: root2
# 设置文档名称
spring:
  profiles:
    active: prod
复制代码

上述方式如果在配置内容非常多的时候,还是比较臃肿,还可以采取拆分成多个 .yml 文件,然后进行加载

文件名称设置为 application-* 后半部分默认就是文档名

#application-dev.yml
jdbc:
  url: jdbc:mysql://localhost:3306/test
  username: root1
  password: root1
复制代码
#application-prod.yml
jdbc:
  url: jdbc:mysql://localhost:3306/test
  username: root2
  password: root2
复制代码
#application.yml
spring:
  profiles:
    active: dev
复制代码

以上都是加载单个配置文件,如果要加载多个文件,可以这样配置

#application.yml
spring:
  profiles:
    active: [dev, port] # 加载多个配置文件
复制代码

原文链接:https://juejin.cn/post/6935207436944932894

如果觉得本文对你有帮助,可以关注一下我公众号,回复关键字【面试】即可得到一份Java核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!

 

标签:SpringBoot,配置文件,spring,代码,springframework,详解,复制,org,入门
来源: https://blog.51cto.com/u_15265637/2889447

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有