Spring Boot 笔记 (1) - Maven、基本配置、Profile的使用
一. Spring Boot 简介
开箱即用的一站式 Java EE 解决方案
Spring 技术栈的大整合
核心问题
暂时无法回答
Spring Boot 和 SOA 有什么区别?
Spring Boot 与 Spring Cloud 的区别与关系?
SpringBoot 做了什么应对微服务的趋势?
其他问题
微服务是什么?
SOA 是什么?
Serveless 又是什么?
Spring Cloud 是什么?
二. Maven
更多 Maven相关内容, 可参考 Maven 笔记 - 难以想象的晴朗
完整 POM 文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--项目信息-->
<groupId>com.imzhizi.work</groupId>
<artifactId>xingren</artifactId>
<version>1.2.0-SNAPSHOT</version>
<!--Spring Boot 的父依赖, 统一控制版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.7.RELEASE</version>
</parent>
<!--构建打包时的编码和 Java 版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<!--通过该插件, 项目将打包为 xingren-1.2-SNAPSHOT.jar -->
<!--项目运行命令为 mvn spring-boot:run -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<dependencies>
<!--一些 Spring Boot 依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--数据库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--一些推荐的工具库-->
<!-- getter、setter 省略工具 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--JSON 处理工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!--DTO 处理工具-->
<dependency>
<groupId>org.modelmapper</groupId>
<artifactId>modelmapper</artifactId>
<version>2.3.0</version>
</dependency>
<!-- JWT 鉴权工具类-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies>
</project>
其他配置
<groupId>edu.北京邮电大学</groupId>
<artifactId>coope</artifactId>
<version>1.0-SNAPSHOT</version>
<!--表明打包为 war 包-->
<packaging>war</packaging>
<build>
<!--决定了最终生成的包的名称, 默认为 项目名+版本-->
<finalName>coope</finalName>
</build>
三. 核心注解
SpringBootApplication
@SpringBootApplication
||
@SpringBootConfiguration // springboot 配置类, 代表以前的 xml
@EnableAutoConfiguration // 开启自动配置功能, 配置上面的 springboot
# 其中
@EnableAutoConfiguration
||
@AutoConfigurationPackage // 自动配置包
@Import({EnableAutoConfigurationImportSelector.class}) // 导入自动配置类
public @interface EnableAutoConfiguration // 里面放满了各种AutoConfiguration 类名
# 其中
@AutoConfigurationPackage
||
@Import({Registrar.class})
// 自动配置包使用了 Spring 的底层注解 import, 给容器中导入Registrar.class
// 将 SpringBootApplication 所标注的类全部扫描到 Spring 容器中
// 哪里标注了哪些类需要加载呢? 或许是下面的选择器(Selector)
@Import({EnableAutoConfigurationImportSelector.class})
||
EnableAutoConfigurationImportSelector
||继承
AutoConfigurationImportSelector
// 会把该场景需要的所有自动配置类扫描进来 annotationMetadata
// 此类含有 getAutoConfigurationImportListeners 方法
// 此方法使用SpringFactoriesLoader.loadFactories() 加载配置类
// 工厂会完成自动配置工作(把这些自动配置类配置的东西标记为Bean, 然后加载进去)
Controller
一些常见的注解, 没什么新奇的
@Controller
@RestController
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@RequestMapping
@PathVarible
@RequestParam
@RequestBody // 用于实体 JSON 类型数据的实例化
@ModelAttributes // 用于非 JSON 类型的数据, 尤其是多媒体文件
@Service
@Repository
@Entity
@AutoWired
@Bean
四. SpringBoot 配置
配置文件, 两个均可使用, 用于 修改默认的配置
- applicaiton.properties
- application.yml (递归命名, 以数据为中心, 更适合做配置文件)
通过此注解
- 可以把配置中的每一个值配置到组件中
- 通过 presfix 和配置中的前缀相匹配
- 既然是组件中, 所以配置类必须声明为组件
配置文件加载顺序
SpringApplication 将从以下位置的 application.properties 文件加载属性,并将它们添加到Spring Environment, 按照以下顺序优先级从高到低, 高优先级会覆盖低优先级的配置
- ./config 项目根目录的config目录
- 项目根目录 ./
- A 类路径 classpath/config 包
- A 类路径根 classpath/
- 为生成的 jar 启动时指定参数
--spring.config.location="config path"来追加配置, 与之前的默认配置形成互补
外部配置文件加载
命令行参数
所有的配置都可以在命令行上进行指定
多个配置用空格分开; --配置项=值
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc来自 java:comp/env 的JNDI属性
Java系统属性(System.getProperties())
操作系统环境变量
RandomValuePropertySource配置的random.*属性值
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
@Configuration注解类上的@PropertySource
通过SpringApplication.setDefaultProperties指定的默认属性
配置文件 YAML 用法
为什么不用 applicaiton.properties, 主要因为 applicaiton.properties 需要写很多遍 prefix
# yaml 写法
# 简单值
k: v # 字符串默认不加引号
k: 'hello \n world' # 原形输出
k: "hello \n world" # 转义输出
# 对象, map 写法
k:
sk: sv # 换行缩进写出
sub-name1:
subName2: # 效果是一样的
k: {sk1: sv1, sk2: sv2}
# 数组写法
k: {v1,v2} # 大括号写法
k: # 换行缩进写法
- v1
- v2
配置文件占位符
## 随机数
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
## 占位符
my.secret=${random.value}
my.number=${my.secret:my-secret}
# 读取配置文件中的其他值, 通过:指定该值不存在时的默认值
配置信息读取
配置注入 @ConfigurationProperties
maven 需要导入
spring-boot-configuration-processor
@Component // 声明为组件, 会被自动加载到 Spring 容器中
@ConfigurationProperties(prefix="config-test") // 从文件中读取配置的类
public class ConfigurationTest {
private String name;
}
值注入注解 @Value
// 通过 ${} 从配置文件, 环境中加载值
// 通过 #{} 使用 SpEL 表达式来计算值
public class ConfigurationTest {
@Value("${config-test.name}")
private String name;
}
配置类测试
使用 SpringBoot 自带的测试框架来替代 JUnit
@RunWith(SpringRunner.class)
@SpringBootTest
public class XxxTest{
@AutoWired
Xxx xxx;
@Test
public void contextLoads(){
// 使用 xxx 进行测试
}
}
@ConfigurationProperties VS @Value
| 功能 | @ConfigurationProperties | @Value |
|---|---|---|
| 松散绑定 | 支持 | 支持 |
| SpEL | 不支持 | 支持 |
| JSR303 数据校验 | 支持 | 不支持 |
| 元数据 | 支持 | 不支持 |
| 批量绑定 | 支持 | 不支持 |
| 复杂类型封装 | 支持 | 不支持 |
松散绑定是指 lastName == last-name == last_name == LAST-NAME
所以 @Value 一般是用于取到某项值
而 @ConfigurationProperties 用于真正的配置类
校验注解 @Validated 用于数据校验, 直接加在属性值上, 比如说 @Email
其他来源的配置文件@PropertySource @ImportResource
默认加载的配置都是项目的全局配置文件, 假如想把一些与全局无关的配置抽取出来, 读取此新建配置文件时就需要使用 PropertySource 注解来指定.
@PropertySource(value = {"classpath:xxxx.properties"})
当使用了 Spring 早期的 xml 配置文件, 希望把该 配置文件加再进来, 那么就要用 @ImportResource 导入进来
@ImportResource(locations = {"classpath:beans.xml"})
配置类 @Configuration - 消灭 xml !!!
@Configuration
public class MyAppConfig{
@Bean // 代替 xml 来进行配置, 添加组件, 其实@Component 可以直接注册到容器中
public HelloService helloService(){
// 初始化 Bean 并返回
return helloService;
}
}
五. Profile 实现多配置
多 properties 配置文件方式
# application-dev.properties 文件
server.port=8080
# application-prod.properties 文件
server.port=80
YAML 多文档块方式
通过三个 - 进行文档分块
# application.yml 文件
server:
profiles:
active: name(dev 或 prod)
---
server:
port: 8080
profiles: dev
---
server:
port: 80
profiles: prod
激活不同 Profile 的方法
# 配置文件中声明
spring.profiles.active = 要激活的配置文件
spring:
profiles:
active: 要激活 profile
# 参数控制
# 在运行 jar 时传参激活
--spring.profiles.active=dev
# 指定 Java 虚拟机参数激活
-Dspring.profiles.active=dev
Spring Boot 笔记 (1) - Maven、基本配置、Profile的使用的更多相关文章
- [Spring Boot 系列] 集成maven和Spring boot的profile 专题
maven中配置profile节点: <project> .... <profiles> <profile> <!-- 生产环境 --> <id& ...
- spring boot 笔记--第三章
spring boot 笔记 第三章,使用Spring boot 构建系统: 强烈建议支持依赖管理的构建系统,Maven或Gradle 依赖管理: Spring Boot的每版本都会提供它支持的依赖列 ...
- Spring Boot 2.3 新特配置文件属性跟踪
背景 当我们使用 spring boot 在多环境打包,配置属性在不同环境的值不同,如下: spring: profiles: active: @project.profile@ #根据maven 动 ...
- Spring Boot应用的后台运行配置
酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...
- Spring Boot 启动(二) 配置详解
Spring Boot 启动(二) 配置详解 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) Spring Boot 配置 ...
- JAR(Spring Boot)应用的后台运行配置
酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用主类 使用Mave ...
- Spring Boot应用的后台运行配置(转载)
作者:程序猿DD 酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前,我们先回顾一下Spring Boot应用的几种运行方式: 运行Spring Boot的应用 ...
- Spring Boot项目简单上手+swagger配置+项目发布(可能是史上最详细的)
Spring Boot项目简单上手+swagger配置 1.项目实践 项目结构图 项目整体分为四部分:1.source code 2.sql-mapper 3.application.properti ...
- [转]Spring Boot应用的后台运行配置
转自:http://blog.didispace.com/spring-boot-run-backend/ 酱油一篇,整理一下关于Spring Boot后台运行的一些配置方式.在介绍后台运行配置之前, ...
随机推荐
- java捕获一个网站页面的全部图片
直接上代码: package com.jeecg.util; import java.io.BufferedReader; import java.io.FileNotFoundException; ...
- vue-qriously 生成二维码并下载、cliploard复制粘贴
xxx.vue <template> <a-modal class="dialogRecharge" title="活动链接及二维码" v-m ...
- 百度分享实现https
什么是百度分享,看下面两个图. 还要自己写js,css吗?那不存在的,百度已经给出了解决方案并分享了出来 http://share.baidu.com/code/advance 缺陷是不支持 http ...
- 【Java】Spring之面向方面编程(AOP)(五)
面向方面编程(AOP)通过提供另一种思考程序结构的方式来补充面向对象编程(OOP).OOP中模块化的关键单元是类,而在AOP中,模块化单元是方面.方面实现了跨越多种类型和对象的关注点(例如事务管理)的 ...
- [LeetCode] 549. Binary Tree Longest Consecutive Sequence II 二叉树最长连续序列之 II
Given a binary tree, you need to find the length of Longest Consecutive Path in Binary Tree. Especia ...
- LeetCode:复原IP地址【93】
LeetCode:复原IP地址[93] 题目描述 给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: [&qu ...
- harbor的安装和简单使用【h】
安装docker的私有仓库, 利用vmware提供的harbor工具, 参考Docker 私有仓库方案比较与搭建, Harbor安装 -- 企业级Registry仓库 2.2harborProject ...
- 2019年广东外语外贸大学程序设计竞赛(新手赛)-F题(好快的刀)题解
题面: 题目意为,任意连接两个圆的圆心形成一条直线,计算与该直线相交或相切的圆的数量,求这些直线最多能相交或相切多少个圆 解题思路: 遍历所有的圆,计算出两圆圆心生成的直线,再遍历其他的圆,检测这些圆 ...
- 删除List集合中的元素你碰到过这样的陷阱吗?
删除List的三种方式: (1) 普通遍历 : @Test public void testList(){ ArrayList<String> list = new ArrayList&l ...
- Linux(ubuntu)软件的安装
通过apt安装/卸载软件 apt是advanced packaging tool,是Linxu下的一款安装包管理程序 可以在终端中方便的安装/卸载/更新软件包 # 安装软件 sudo apt inst ...