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核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!