SpringBoot
Maven补充
依赖冲突
什么是依赖冲突
场景:
spring-webmvc、spring-jdbc
都依赖spring-beans
spring-webmvc
的版本是5.2.8,那么它依赖的spring-beans
的版本也是5.2.8spring-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.factories
- ServletWebServerFactoryAutoConfiguration
- ServerProperties
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] # 加载多个配置文件