这周是学习的Sprnig Boot的操作方法
Spring Boot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置于逻辑业务之间进行切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发效率,一定程度上缩短了项目周期。
Spring :the source for modern java
App ->Spring Boot (Build)build anything -> Spring Cloud (Coordinate) coordinate anything -> Spring Cloud Data Flow (Connect) connect everything
配置繁琐
Spring拥有轻量级的组件代码,但是配置却是重量级的,起初,Spring是使用XML的配置,然后启用了基于Java的配置替代了XML配置,从一定程度上减轻了Spring的配置负担。但是,这些配置仍然是代表着开发时的损耗。
依赖繁琐
在使用项目构建工具,构建Spring项目时,需要引入很多jar包,这些jar包之间的版本依赖性需要我们进行调节,这也是十分复杂的过程。
自动配置
Spring Boot的自动配置是一个应用程序启动时的过程,由Spring Boot 自动完成并决定Spring的配置选用。
起步依赖
起步依赖本质是一个Maven项目对象模型(Project Object Model, POM),定义了对其他库的传递依赖,这些东西加在一起就可以支持某项功能。即:起步依赖就是将某种功能的坐标打包到一起,并提供一些默认的功能。
辅助功能
提供了一些大型项目中常见的非功能性特性,如:嵌入式服务器、安全指标、健康检测、外部配置等。
Spring Boot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式
在了解搭建Spring Boot工程流程后,我们就手动进行一下搭建工程。
我们先创建一个Maven模块,
File -> New -> Module…
然后我们就在module选项中选择Maven的模块,选中SDK的版本,起名。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Osq85TlR-1632461544818)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210922222428561.png)]
当我们完成创建Maven文件后,就进入到了pom文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yONk5OvR-1632461544820)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210922222452286.png)]
一个最初的Maven文件就创建好了。
在pom文件中,我们就要已引入相关的起步依赖与坐标,这些坐标可以在官方的文档中找到
Spring Boot官方使用手册
在官方手册的getting start 的 Installing Spring Boot 中可以找到Maven Installing 这里就有官方的Guidance book
Spring Boot Maven Plugin Documentation(Maven的官方使用手册)
这个地方我们可以找到pom文件起步依赖的一些模板
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6yzTSW73-1632461544822)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923172045264.png)]
我们就可以吧从这里获得的parent父项目拷贝下来粘贴过去
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.5.5version>
parent>
起步依赖已经添加了,我们可以在这里加入继续把web相关的坐标给依赖传递进来
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
dependencies>
在我们添加完起步依赖以后,我们终于可以开始写代码了,
先在main的java文件夹里创建一个类;
然后再写注解
@RestController
//这里我们在方法上访问,就不注解@RequestMapping
package com.kdny.java05;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CreaterController {
}
然后,我们在类里面写一个方法,并给方法上加入注解@RequestMapping,自己设置一个路径
@RequestMapping("/hello")
public String hello(){
return "Hello Spring Boot !";
}
这个controller十分简单就是会执行这个hello的方法并返回字符串,这个方法的访问路径就是hello
为了可以启动这个项目,并访问这个方法,我们就要开始写个引导类
在编写引导类之前,我们要了解到引导类的类名结尾一般都是Aplication结尾。我们就先创建一个引导类,并加入引导类的注解,再写入main()方法,这里我们可以把引导类理解为Spring Boot项目的启动入口。
package com.kdny.java05;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
SpringApplication.run(HelloApplication.class,args);
}
}
引导类的编写就完成了,我们只需运行这里的main()方法,就可以启动整个Spring Boot工程
这里就运行引导类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjBGc3lB-1632461544824)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923195749246.png)]
这个就是已经启动成功了,下面这些有些不同颜色的字样的就是Spring Boot的日志,我们可以看到这里有一个内置的Tomcat已经启动
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NycvN8AP-1632461544826)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923200056433.png)]
在8080这个端口,我们就可以打开浏览器去访问一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZIs5XTq-1632461544827)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923200228433.png)]
我们可以看到这个字符串已经可以成功的在浏览器上被访问到。
刚刚我们手动进行了Spring Boot工程的搭建,也许已经注意到了,我们在pom.xml文件中并没有去指定工程的打包方式,这里我们要注意:Spring Boot在创建项目时,是使用jar的打包方式,因为Spring Boot项目的入口是通过运行main方法来启动的。既然是使用jar包的打包方式,那就说明我们可以直接用Idea引入创建好了的Spring Boot基础工程。这样就不需要我们去写pom文件,及引导类。
这里我们可以直接使用Idea去自动生成Spring Boot的工程,就是在new Module中选择Spring Initializr,然后就可以进行填写项目信息
这里可以看到Idea需要进行访问这个默认网页,我们也可以直接使用这个网址进行构造Spring Boot的工程。
Spring Initializr
工程建立完成后,因为这个是以jar的形式进行打包,我们就可以把这个jar包导入到Idea中,并关联上Maven
再编写一个引导类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml (application.yaml)进行配置。
server.port = 8080;
server:
port: 8080
yml里需要注意键和值之间是有一个空格的
打开Spring Boot工程,在resources中我们可以找到application.properties的文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ReCnzJa-1632461544832)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923205521806.png)]
在这里我们就可以改变默认值,比如:把port改成8082
server.port=8082
运行一下,就可以看到,端口已经改变了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M36NltHX-1632461544833)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923205644681.png)]
在application.properties中我们除了可以配置原有的属性之外,我们还可以配置自己定义的属性,但是这就需要我们在程序中写下自定义的加载、读取、配置方法。
使用yml的方式修改原始的配置,我们需要在resource文件夹下创建一个application.yml的文件
然后就可以进行更改操作
server:
port: 8089
重新启动引导类,就可以看到端口改变为了8089
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGfS40zl-1632461544834)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923210312063.png)]
yml中还有yaml的后缀名,这个操作也是一样的,就不在操作了。
在多个配置文件同时存在时
properties的优先级高于yml高于yaml
低优先级中的配置如有和高优先级的配置重复的地方会被忽视。
我们可以测试一下,把之前两个配置文件同时写上,启动运行后,port是properties定义的8082
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFcs2sfU-1632461544835)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923210938473.png)]
YAML全称是 YAML Ain’t Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP 等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
YAML文件的扩展名可以使用.yml或者.yaml。
server.port = 8080;
server.address = 127.0.0.1
<server>
<port>8080port>
<address>127.0.0.1address>
server>
server:
port: 8080
address: 127.0.0.1
我们可以看到,使用properties书写的时候,我们难以直观的看到这些属性之间的层级关系;使用xml我们可以看到层级关系但是比较复杂;而yaml既可以看到层级关系,还简洁,以数据为核心。
大小写敏感
数据值前边必须有空格,作为分隔符
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
‘#’ 表示注释,从这个字符一直到行尾,都会被解析器忽略。
yaml中有三种不同的数据格式
person:
name: GXY
# 行内写法
person: {name: GXY}
address:
- beijing
- shanghai
# 行内写法
address: [beijing,shanghai]
msg1: 'hello \n world' # 单引忽略转义字符
msg2: "hello \n world" # 双引识别转义字符,分两行输出
这里我们定义了一个参数,在后面我们需要引用就可以使用这种方式进行参数引用
name: GXY # 定义name值为GXY
person:
name: ${name} # 引用上边定义的name值
刚刚我b们进行了配置文件的编写,现在我们要进行将配置文件中的内容给读取出来
Spring Boot提供了三种读取配置文件内容的方式
我们在yml的配置文件中,定义一个person的对象,我们就在Controller中读取出来
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZ0385zT-1632461544836)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923214716853.png)]
并且,再把读取过来的对象打印出来
@Value("${person.name}")
private String name;
@Value("${person.age}")
private int age;
@RequestMapping("/person")
public void outputPerson() {
System.out.println(name);
System.out.println(age);
}
现在,我们可以启动引导类测试一下,运行一下,成功了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PXcgVE2-1632461544837)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923221202539.png)]
然后,我们所需要的配置属性也进行了输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQSDoY3k-1632461544838)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923221254824.png)]
注意:当数组要进行输出的时候,我们是要一个元素一个元素的输出,@Value("${array[脚标]}")
上面我们使用@Value的方法获取配置文件的值,过程还是有些麻烦,要把值一个一个的注入,这个方法获取单个的值是比较方便的,但当我们要获取更多的值的时候就变的异常麻烦。这里我们使用Environment的方式.
该方式就是直接注入一个Environment环境的一个对象(是spring framework包中的)
@Autowired
private Environment environment;
然后就在下面的获取方法中,使用对象获取键的值
@RequestMapping("/person")
public String outputPerson() {
System.out.println(name);
System.out.println(age);
System.out.println("*******below is Environment*******");
System.out.println(environment.getProperty("person.name"));//getProperty("是待读取的值的键")
System.out.println(environment.getProperty("person.age"));
return "hello Spring Boot";
}
测试一下读取结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVWxFwjs-1632461544838)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923223358727.png)]
使用@ConfigurationProperties读取配置文件,其实是一种将配置内容和对象进行相互绑定的一种方式。前两个方式是将属性单独的注入到我们需要使用的位置上,@ConfigurationProperties是将给属性创建一个对象,在我们配置内容的属性值就会自动的注入到该对象对应的位置上。
这里我们就要先创建一个属性类,这里按刚刚的person为例,并把内在属性写过来,并给这些属性变量添加getter和setter方法,为了便于打印还要加入toString的方法
package com.kdny.demo.controller;
public class Person {
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
private String name;
private int age;
@Override
public String toString() {
return "person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
为了让改类被spring识别,我们要加@Component的注解;然后在加上这个@ConfigurationProperties的注解
package com.kdny.demo.controller;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties
public class Person {
加上以后,我们会收到注解程序在类的路径下未找寻的警告,并不影响使用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gBB5MTRH-1632461544839)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923225239610.png)]
我们在这个@ConfigurationProperties后面要添加前缀,这里就是person的前缀
@ConfigurationProperties(prefix = "person")
在Controller中,我们要把刚刚创建的person类用@Autowired注解注入,
@Autowired
private Person person;
然后注解注入的person对象打印出来
public String outputPerson() {
System.out.println(name);
System.out.println(age);
System.out.println("*******below is Environment*******");
System.out.println(environment.getProperty("person.name"));
System.out.println(environment.getProperty("person.age"));
System.out.println("*****below is @ConfigurationProperties*******");
System.out.println(person);
return "hello Spring Boot";
}
最后测试一下结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DKZnql0c-1632461544840)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923235408729.png)]
现在,再来解决上面那个warming的问题,其实就是在pom中缺了一个对配置文件提示的依赖的添加,现在我们添加进去就行了,这样就可以在配置文件的编写中得到hint。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
1) profile配置方式
多profile文件方式
yml多文档方式
2) profile激活方式
配置文件
虚拟机参数
命令行参数
多profile文件方式,我就先设置几个application文件,并在这些文件中设置不同的port
这里要注意application.properties文件的命名方式:application-XXX.properties
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0go1C5fz-1632461544841)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210924011346387.png)]
我们先运行,端口是8080,并且显示还没有激活profile
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXoUd7L2-1632461544842)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210924011421286.png)]
我在application.properties这个主文件里面进行profile激活,这里可以选择激活的其他文件,这里先激活application-dev.properties文件
spring.profiles.active=dev
运行,我就可以看到dev已被激活,并且port切换成了dev文件中定义的8081
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bEaCCSt3-1632461544842)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210924012003509.png)]
这是properties的多文件,yaml同样可以进行多文件配置。
yml多文档可以实现一个yml文件下实现多个不同环境下的配置
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: test
---
server:
port: 8083
spring:
profiles: pro
---
spring:
profiles:
active: dev
这里这个三条杠是用来区分不同的环境
我们用spring.profiles给每一部分起名
spring:
profiles: dev
然后,就是激活,激活操作和多profile文件操作相同在该yml文件下加入spring.profiles.active
spring:
profiles:
active: dev
上面已经展示了配置文件激活profile的方式,即在配置文件中,spring.profiles.active -待激活profile 文件
这一块还在继续学习中。。。。
l同样可以进行多文件配置。
yml多文档可以实现一个yml文件下实现多个不同环境下的配置
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: test
---
server:
port: 8083
spring:
profiles: pro
---
spring:
profiles:
active: dev
这里这个三条杠是用来区分不同的环境
我们用spring.profiles给每一部分起名
spring:
profiles: dev
然后,就是激活,激活操作和多profile文件操作相同在该yml文件下加入spring.profiles.active
spring:
profiles:
active: dev
上面已经展示了配置文件激活profile的方式,即在配置文件中,spring.profiles.active -待激活profile 文件
这一块还在继续学习中。。。。