学习内容:学习SpringBoot(Day67)
1、SpringBoot入门
2、SpringBoot配置文件
1、SpringBoot入门
(1)Spring Boot 是 Spring 社区较新的一个项目。该项目的目的是帮助开发者更容易的创建
基于 Spring 的应用程序和服务,让更多人的人更快的对 Spring 进行入门体验,为 Spring 生态系统提供了一种固定的、约定优于配置风格的框架。
Spring Boot 具有如下特性:
1.为基于 Spring 的开发提供更快的入门体验
2.开箱即用,没有代码生成,也无需 XML 配置。同时也可以修改默认值来满足特 定的需求。
3.提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健
康检测、外部配置等。
4.Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式。
(2)创建 Maven 工程 springboot_demo,在 pom.xml 中添加如下依赖
<!--父依赖,相关的依赖jar包都会传递进来,版本也做了统一-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.6</version>
<relativePath />
</parent>
<dependencies>
<!--引入web的场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
(3)创建引导类,也就是启动类
//启动类
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class,args);
}
}
@SpringBootApplication其实就是以下三个注解的总和
@Configuration: 用于定义一个配置类
@EnableAutoConfiguration:Spring Boot 会自动根据你 jar 包的依赖来自动配置项目。
@ComponentScan: 告诉 Spring 哪个 packages 的用注解标识的类 会被 spring 自动扫描并 且装入 bean 容器。
范围:扫描启动类所在的包及其子包下所有的注解,如果不在同一个包下,就会报错,找不到,原因是因为扫描不到包。@SpringBootApplication(scanBasePackages = {"com.hisoft"})
(4)创建Controller类,实现 json 数据的输出。如果是在Spring中,需要配置xml文件才能实现,但是在SpringBoot中直接写Controller类就行。
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello SpringBoot";
}
}
@RestController是一个组合注解:
@Controller,
@ResponseBody 用与返回字符串或json数据。
运行启动类,在浏览器地址栏输入 http://localhost:8080/hello 即可看到运行结果。
(5)@Configuration注解
创建一个HelloConfig类
@Configuration//标注配置类,相当于xml配置文件,可以把这个类注入到Bean管理
public class HelloConfig {
@Bean//注入一个String对象,id是方法名getString
public String getString(){
return "Hello SpringBoot";
}
}
创建一个Test类,自动注入Config类中配置的bean
@SpringBootTest
public class SpringBootApplicationTest {
@Autowired
@Qualifier(value = "getString")
private String str;
@Autowired
private HelloConfig helloConfig;
@Test
void contextLoads() {
System.out.println(str);//Hello SpringBoot
System.out.println("string = " + helloConfig.getString());//string = Hello SpringBoot
}
}
2、SpringBoot配置文件
(1)在 src/main/resources 下创建 application.properties 或者 更加简洁的application.yml或者application.yaml文件。
application.properties文件:
#端口号
server.port=8081
#上下文路径
server.servlet.context-path=/hello
(2)application.yml文件:YAML全称是YAML Ain’t Markup Language。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C+ +, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
YAML文件的扩展名可以使用.yml或者yaml。
YAML:基本语法
●大小写敏感
●数据值前边必须有空格,作为分隔符
●使用缩进表示层级关系
●缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)。
●缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
●#表示注释,从这个字符一直到行尾,都会被解析器忽略。
yaml是一种冒号,空格,换行的数据格式,后缀可以是yml,也可以是yaml。
如果两个application.properties和application.yml同时存在,优先加载application.properties,
优先级:properties>yml>yaml
server:
port: 8082
servlet:
context-path: /hello
(3)yml数据格式:下一级要空两格,“ : ”和“ - ”后要空格
#自定义用户对象
user:
name: zhangsan
age: 20
#对象行内写法
user2: {name: lisi,age: 21}
#数组
address:
- shanghai
- beijing
- guangzhou
#数组行内写法
address2: [zhengzhou,xian,taiyuan]
#纯量
msg1: 'hello \n world' #不会识别转义字符,会原样输出
msg2: "hello \n world" #会识别转义字符,分两行输出
#参数引用
name: lisi
person:
name: ${name}
age: 22
address:
- shanghai
- beijing
- guangzhou
(4)读取自定义配置文件信息
方式一:使用Environment对象
@Autowired
private Environment environment;
@Test
void Test() {
String name = environment.getProperty("user.name");
String name2 = environment.getProperty("user2.name");
String address = environment.getProperty("address[0]");
String msg1 = environment.getProperty("msg1");
String msg2 = environment.getProperty("msg2");
System.out.println("name=" + name);
System.out.println("name2=" + name2);
System.out.println("address[0]=" + address);
System.out.println("msg1=" + msg1);
System.out.println("msg2=" + msg2);
}
方式二:使用@Value注解
@Value("${person.name}")
private String name;
@Value("${address[0]}")
private String address;
@Value("${msg1}")
private String msg1;
@Value("${msg2}")
private String msg2;
@Test
public void EnvironmentTest2(){
System.out.println("name=" + name);
System.out.println("address[0]=" + address);
System.out.println("msg1=" + msg1);
System.out.println("msg2=" + msg2);
}
方式三:使用@ConfigurationPropertis注解:把配置信息和对象属性绑定起来
创建实体类
@Data
@ToString
@ConfigurationProperties(prefix = "person")//设置前缀为person
@Component
public class Person {
private String name;
private int age;
private String[] address;
}
自定义配置信息
#参数引用
name: lisi
person:
name: ${name}
age: 22
address:
- shanghai
- beijing
- guangzhou
测试
@Autowired
private Person person;
@Test
public void ConfigurationPropertiesTest(){
System.out.println(person);
}
Tip:红色提示框问题,需要注解处理器,添加依赖:
<!--配置处理器,在yml文件中自定义配置信息时会进行提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
之后重构项目,红色提示框就会消失。
(5)多环境配置文件
profile:
我们在开发SpringBoot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
profile配置方式一:多profile文件方式
创建多个application.properties文件,application-dev.properties,application-online.properties,application-test.properties。
不同的配置文件使用不同的端口,如application-dev.properties中
#端口号
server.port=8081
这里springboot默认加载application.properties文件,需要在默认文件中把其他的配置文件进行激活
#激活指定环境
spring.profiles.active=test
如果激活的和默认配置文件配置信息相同,优化走激活。
profile配置方式二:yml多文档方式
用三个横杠隔开不同配置,每段内容是一个文档。
---
server:
port: 8081
spring:
config:
activated:
on-profile: dev
---
server:
port: 8082
spring:
config:
activated:
on-profile: online
---
server:
port: 8083
spring:
config:
activated:
on-profile: test
---
#激活指定环境
spring:
config:
active: dev
激活profile方式除了配置文件激活外,还有虚拟机参数激活和命令行参数激活两种方式:
虚拟机参数激活
命令行参数激活
项目打包后运行,也可以临时激活其它的配置文件。打开jar包所在目录,shift+右键 在此地打开powershell窗口。
如果提示没有主清单属性,可能是因为缺少插件,在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。这在很大程度上简化了应用的部署,只需要安装了 JRE 就可以运行。版本号要和SpringBoot一致
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.6</version>
</plugin>
</plugins>
</build>
(6)配置加载顺序
内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
1.fle…config/: 当前项目下的/config目录下
2.fle/: 当前项目的根目录
3.classpath:/config/:classpath(resource和Sources root下)的/config目录
4.classpath:/:classpath的根目录
加载顺序为:上文的排列顺序,高优先级配的属性会生效,多个配置文件效果是互补的。
外部配置加载顺序
加载外部配置文件:spring.config.location。如果配置文件在同一目录下会自动读取。放入config目录也会自动读取,而且优先级更高。
外部和内部配置互补,项目打包好后不用修改配置文件重新打包,只需要把要修改的配置写到外部文件即可。
(7)启动SpringBoot项目后会看到一个图案,这个团可以自定义的。
这个网站可以查找自己想要的艺术字https://www.bootschool.net/ascii-art/chinese
然后拷贝生成的字符到一个文本文件中,并且将该文件命名为banner.txt,将banner.txt拷贝到项目的resources目录中。