Spring Boot来简化spring应用开发,约定大于配置去繁从简,just run就能创建一个独立的,产品级别的应用。
背景:J2EE笨重开发,繁多的配置、低下开发效率、复杂的部署流程、第三方技术集成难度大。
解决: “Spring全家桶”时代;Spring Boot → J2EE一站式解决方案;Spring Cloud → 分布式整体解决方案。
快速创建独立运行的Spring项目以及与主流框架集成 ;使用嵌入式的Servlet容器,应用无需打成war包 ;starters自动依赖与版本控制 ;大量自动配置,简化开发,也可以修改默认值;无需配置XML,无代码生成,开箱即用;准生产环境的运行时应用监控;与云计算的天然集成。
微服务:架构风格(服务微化)
一个应用应该是一个一组小型服务;可以通过HTTP的方式进行互通;单体应用:ALL IN ONE;微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元。
JDK1.8:SpringBoot推荐JDK1.7及以上
Maven3.x:maven3.3以上版本
eclipse:2018、IDEA2017或者STS
SpringBoot2.4.4RELEASE
maven设置本地仓库,在maven的conf文件中seting.xml文件的localRepository下方加上
D:\software\maven\repository
给maven的setting.xml配置文件的profiles标签中添加
jdk-1.8
true
1.8
1.8
1.8
1.8
maven的mirrors标签添加阿里云镜像:
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
maven配置环境变量:
在系统变量新建MAVEN_HOME,D:\software\apache-maven-3.6.0;
在Path中末尾加入:%MAVEN_HOME%\bin;
根据统一编码截图设置,除了Text本身设置为UTF-8编码外,属于他的几个子节点也要改,分别是:Text下的:Java Properties;Java Properties下的:Spring Properties;Text下的:JSP;以及JSP下的两个以JSP开头的两个子节点(编码可改也可不改)。
首先选中Spring perspective,在Package Explorer导航图下,右键new选择Spring start Project弹出如下对话框:
点击Next后,直接点击Finish按钮,再次点击Finish
在pom.xml文件中,加上:
1.8
3.1.1
右键项目,选择Maven项目,选择更新项目(update project)
处理完成后,启动XXXXXApplication.java的main方法,看到控制台有如下报文,就说明项目创建成功,配置也成功了!
功能描述: 浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串;
1、创建一个maven工程;(jar)
2、导入Spring Boot相关依赖
org.springframework.boot
spring-boot-starter-parent
3.1.2
com.school
SpringBoot01
0.0.1-SNAPSHOT
SpringBoot01
Demo project for Spring Boot
1.8
3.1.1
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.webjars
jquery
3.6.0
org.webjars
bootstrap
5.0.0-beta3
org.springframework.boot
spring-boot-starter-thymeleaf
3、编写一个主程序;启动Spring Boot应用
/**
* @SpringBootApplication:标注主程序,说明这是一个Spring boot应用
* @author lenovo
*
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
//启动Springboot应用程序
SpringApplication.run(HelloWorldMainApplication.class, args);
}
}
4、编写相关的Controller、Service
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}
}
或者使用@RestController都是一样的效果:因为@RestController包含了@ResponseBody和@Controller两个注释:
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello world!";
}
}
5、运行主程序测试:
6、简化部署:在加上
org.springframework.boot
spring-boot-maven-plugin
将这个应用打成jar包,直接使用Java -jar的命令进行执行;打包:
有一个要求,运行环境不能只是jre,要向上到jdk
Eclipse:使用Spring Start Project可以快速创建一个Spring Boot项目,选择需要的模块,这是联网去创建一个Spring Boot项目;
默认生成的SpringBoot项目:
主程序已经生成,接下来只需要开始业务逻辑的编写
resources文件夹中的目录结构:
static:保存所有的静态资源;js、css、images
templates:保存所有的模板页面;(SpringBoot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);
application.properties:SpringBoot应用的配置文件,可以修改一些默认配置。
server.port=8085 #设置springboot运行端口为8085,默认为8080
IDEA :使用Spring Initializer快速创建SpringBoot项目
springboot使用一个全局的配置文件,配置文件名是固定的;
application.properties
application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都已经配置好了的。
YAML(YAML Ain't Markup Language)需要辨证角度看这个问题
YAML A Markup Language:yaml是一个标记语言类似
YAML isn‘t Markup Language:yaml不是一个标记语言
YAML:是以数据为中心,比JSON、XML文件等更适合做配置文件
YAML:配置例子,配置项目运行端口
server:
port: 8085
XML
8085
k: v:表示一对键值对(==强调:空格必须要有==)。以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:
port: 8085
path: /hello
属性和值也是大小写敏感的。
字面量:普通的值:数字,字符串,布尔值
k: v:字面直接来写
字符串默认不用加上单引号或者双引号;
"":双引号;会对特殊字符进行转义;特殊字符会作为本身想表示的意思,例如:name: "zhangsan \n lisi",输出内容为:"zhangsan 换行 lisi"
’‘:单引号;不会对特殊字符进行转义;特殊字符最终只是一个普通的字符串数据,例如:name: "zhangsan \n lisi",输出内容为:"zhangsan 换行 lisi"
对象、Map、K-V
k: v:在下一行来写对象的属性和值的关系;==注意缩进==
对象也是k: v的方式
friends:
name: sunwukong
gender: male
行内写法:
friends: {name: zhubajie,gender: female}
数组(List,Set):用- 值表示数组中的一个元素
pets:
- cat
- pig
- dog
行内写法:
pets: [cat,pig,dog]
javaBean:
/**
* @ConfigurationProperties:将配置文件定义的对象,映射到当前类
* prefix="person"是告诉SpringBoot把配置文件哪个对象映射到当前类中
* @author lenovo
*
*/
@Component
@ConfigurationProperties(prefix="person")
public class Person {
private String name;
private Integer age;
private String gender;
private Date birthday;
private Map map;
private List list;
private Horse horse;
}
编写配置文件:application.yml
person:
name: tangseng
age: 18
gender: male
birthday: 2021/4/13
map: {mudidi: 西天,shijian: 取经}
list:
- 孙悟空
- 猪八戒
- 沙僧
horse:
name: 白龙马
gender: male
导入配置文件处理器依赖
org.springframework.boot
spring-boot-configuration-processor
true
==重要提示:lastName与last-name效果一样==
修改Spring Properties File文件编码格式,方便在properties文件中输入中文,如果出现下图所示
需要修改编码格式(之前已经修改过):
注释掉application.yaml里面的内容,并且配置application.properties文件内容如下
#配置中文
person.last-name=唐僧
person.age=18
person.gender=male
person.birthday=2021/4/14
person.map.nudidi=西天
person.map.shijian=取经
person.list=孙悟空,猪八戒,沙僧
person.horse.name=白龙马
person.horse.gender=male
临时解决方案:上网找一个在线转换ASCII的编码格式;
例如:在线编码转换
#配置中文
person.last-name=\u5510\u50e7
person.age=18
person.gender=male
person.birthday=2021/4/14
person.map.nudidi=\u897f\u5929
person.map.shijian=\u53d6\u7ecf
person.list=\u5b59\u609f\u7a7a,\u732a\u516b\u6212,\u6c99\u50e7
person.horse.name=\u767d\u9f99\u9a6c
person.horse.gender=male
在获取配置文件注入值的方法,我们还可以使用@Value(),可以直接获取配置文件的值,还可以进行SpEl(Spring表达式语言【方言】),还可以直接指定值,代码如下:
@Component
//@ConfigurationProperties(prefix="person")
public class Person {
@Value("${person.last-name}")
private String lastName;
@Value("#{6 * 4}")
private Integer age;
@Value("female")
}
@Value和@ConfigurationProperties(prefix="")区别
@ConfigurationProperties() | @Value | |
功能 | 批量映射注入 | 写一个映射注入一个,不写不注入 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
JSR303数据校验
==高版本必须加入JSR303数据校验依赖,低版本可以不添加依赖:==
org.springframework.boot
spring-boot-starter-validation
Java代码如下:
@Component
@ConfigurationProperties(prefix="person")
@Validated
public class Person {
@Email
//@Value("${person.lastName}")
private String lastName;
//@Value("#{6 * 4}")
private Integer age;
//@Value("female")
}
运行结果表示@ConfigurationProperties()支持JSR303数据校验,如图所示:
配置yml和Properties都可以获取到值
如果我们只是单一的获取配置文件某个值时候,推荐使用@Value
如果是对JavaBean对象和配置文件进行映射时,推荐使用@ConfigurationProperties()
Java代码如下:
@RestController
public class SayHelloControll {
@Value("${person.last-name}")
String name;
@RequestMapping("hello")
public String sayHello() {
return "你好!" + name;
}
}
@PropertySource:加载指定的配置文件;
注释掉application.properties文件中的配置信息,并且创建person.properties文件
person.last-name=\u5510\u50e7
person.age=18
person.gender=male
person.birthday=2021/4/14
person.map.nudidi=\u897f\u5929
person.map.shijian=\u53d6\u7ecf
person.list=\u5b59\u609f\u7a7a,\u732a\u516b\u6212,\u6c99\u50e7
person.horse.name=\u767d\u9f99\u9a6c
person.horse.gender=male
在Person.java文件中加入@PropertySource(value = { "classpath:person.properties" }),Java代码如下:
@PropertySource(value = { "classpath:person.properties" })
@Component
@ConfigurationProperties(prefix="person")
//@Validated
public class Person {
//@Email
//@Value("${person.last-name}")
private String lastName;
//@Value("#{6 * 4}")
private Integer age;
//@Value("female")
private String gender;
private Date birthday;
private Map map;
private List list;
//@Value("${person.horse}")
private Horse horse;
}
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
创建beans.xml
根据beans.xml文件创建对应的HelloService类
package com.wjz.services;
public class HelloService {
}
获取Spring容器对象,通过ioc.containsBean();方法校验是否存在此对象
@Autowired
ApplicationContext ioc;
@Test
public void testHelloService() {
boolean flag = ioc.containsBean("helloService");
System.out.println(flag);
}
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
@ImportResource(locations= {"classpath:beans.xml"})
@SpringBootApplication
public class MySpringBootDemo04Application {
public static void main(String[] args) {
SpringApplication.run(MySpringBootDemo04Application.class, args);
}
}
SpringBoot不推荐编写Spring配置文件
SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式
配置类@Configuration------>Spring配置文件(可以在MySpringBootDemo04Application,一般情况创建自己的配置类)
com.school下创建config,创建自己的MyAppConfig类
使用@Bean给容器中添加组件
/**
* @Configuration:指明这是一个配置类;就是用来替代以前的xml配置文件
* 在配置文件中是通过 标签添加组件(对象)
* @author lenovo
*/
@Configuration
public class MyAppConfig {
/**
* 将方法创建的对象,添加到组件中
* @return
*/
@Bean
public HelloService helloService() {
System.out.println("@Bean成功添加组件到容器中!");
return new HelloService();
}
}
1、随机数
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
2、指定默认值:
person.lastName=唐僧${random.uuid}
person.age=${random.int(100)}
person.gender=male
person.birthday=2021/4/15
person.map.mudidi=西天
person.map.shijian=取经
person.list=[孙悟空,猪八戒,沙僧]
person.horse.name=${person.horseName:小白龙}_马
person.horse.gender=male
1、多profile文件
在编写著配置文件时,文件名可以是application-[profile].properties/yml
==properties、yaml、yml文件优先级:
====properties>yaml>yml==
2、yml的多文档模块
server:
port: 8085
#指定使用哪个环境
spring:
profiles:
active: dev
---
server:
port: 8086
#声明是开发环境
spring:
profiles: dev
---
server:
port: 8087
#声明是生产环境
spring:
profiles: prod
3、指定激活相关profile
1、properties文件:在application.properties文件中指定激活:
spring.profiles.active=prod
2、yml文件:在application.yml文件中指定激活:
spring:
profiles:
active: dev
3.命令行:
java -jar springboot-0.0.1-SNAPSHOT.jar
--spring.profiles.active=dev;
可以直接在测试的时候,program arguments传入参数:
--spring.profiles.active=prod
在VM arguments虚拟机参数的设置:
-Dspring.profiles.active=prod
配置文件优先级从两大方面先进行排序:
项目根目录下的配置文件优先级最高,而class path下的配置文件优先级次之;
同目录下的config文件中的配置文件优先级高:
项目根目录下的config中的配置文件优先级高于根目录下的配置文件
classpath下的config中的配置文件优先级高于classpath根目录下的配置文件
==当四个目录下都有配置文件时,相同配置会被优先级最高的配置文件覆盖,不同配置会进行互补,而不是覆盖!==
当使用命令行启动项目时,命令行优先级最高,选取配置文件的参数时同上。
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
所有的配置都可以在命令行上进行指定
java -jar SpringBootDemo02-0.0.1-SNAPSHOT.jar --server.port=8090 --server.servlet.context-path=/spb
注意:
==Spring Boot1.x版本设置路径:--server.context-path=/spb==
==SpringBoot2.x版本设置路径:--server.servlet.context-path=/spb==
多个配置用空格分开; --配置项=值
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
所有支持的配置加载来自于:Spring Boot Reference Guide