SpringBoot
Maven补充
依赖冲突
什么是依赖冲突
场景:
- spring-webmvc、spring-jdbc 都依赖 spring-beans
- spring-webmvc 的版本是5.2.8,那么它依赖的 spring-beans 的版本也是5.2.8
- 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核心知识点整理与一份面试大礼包!另有更多技术干货文章以及相关资料共享,大家一起学习进步!