Spring Boot学习
Spring Boot环境
一、版本仲裁
使用idea新建spring boot项目,pom.xml文件中自动导入一个父项目依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
它是spring-boot所有starter的父项目,点进去看,这个依赖还有一个父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.1.RELEASE</version>
</parent>
再点进去,可以看到里面有一个properties标签,里面有很多依赖的版本
这个项目是用来真正管理spring boot中所有依赖的版本的,我们称其为spring boot的版本仲裁中心,以后导入依赖默认是不需要版本的,但是没有在版本仲裁中心声明的依赖还是要声明版本号
二、场景启动器
我们要启动一个web项目,还有一个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
点进去看
里面有很多我们所需要使用的依赖,这个spring-boot-starter-web称为spring boot场景启动器,帮我们导入web模块正常运行所依赖的组件
spring boot将所有的功能场景都抽取出来,做成一个个的starter(启动器),只需要在项目中引入这些starter,相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景启动器,我们可以去官网上找到自己需要的启动器依赖启动器文档
启动
一、启动类
/**
* @SpringBootApplication : 来标记一个主程序类,说明这是一个spring boot应用
* 它实际上是一个组合注解,等同于:
* @Target({ElementType.TYPE})
* @Retention(RetentionPolicy.RUNTIME)
* @Documented
* @Inherited
* @SpringBootConfiguration
* @EnableAutoConfiguration
* @ComponentScan(
* excludeFilters = {@Filter(
* type = FilterType.CUSTOM,
* classes = {TypeExcludeFilter.class}
* ), @Filter(
* type = FilterType.CUSTOM,
* classes = {AutoConfigurationExcludeFilter.class}
* )}
* )
*/
@SpringBootApplication
public class springBootDemoApplication {
public static void main(String[] args) {
//springboot应用启动起来,需要传入一个含有@SpringBootApplication注解的类
SpringApplication.run(springBootDemoApplication.class,args);
}
}
@SpringBootConfiguration:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
···
}
spring boot的配置类,标记在某个类上,表示这是一个spring boot的配置类,实质上是一个@Configuration,被@Configuration注解注释的类称为配置类,是spring中用来替代众多xml配置文件的类,配置类也是容器中的一个组件,被@Component注解注释
@EnableAutoConfiguration
将主配置类(@SpringBootApplication注解注释的类)的所在包及下面所有子包里面的所有组件扫描到spring容器中
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
···
}
开启自动配置功能,以前需要配置的东西,spring boot帮我们配置,@EnableAutoConfiguration告诉spring boot开启自动配置功能
@Import({AutoConfigurationImportSelector.class})
AutoConfigurationImportSelector(组件导入选择器):将所有需要导入的组件以全类名的方式返回,给容器中导入非常多的自动配置类(xxxAutoConfiguration),并配置好这些组件
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
···
}
@Import({Registrar.class}):spring的底层注解,给容器导入组件
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
Registrar() {
}
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
}
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
}
}
总结:spring boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作,以前我们需要进行配置的东西,自动配置类都帮我们配置。
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfiguration-(版本).RELEASE.jar包下,我们也可以自定义配置
@ComponentScan
配置
两种配置文件格式:
application.properties
application.yml
固定写法,不能变,修改spring boot自动配置的默认值
PS:还可以使用banner.txt修改spring boot启动时的字符图片
一、application.yml
YAML简介
YAML(YAML Ain't Markup Language)
YAML A Markup Language:是一个标记语言
YAML isn't Markup Language:不是一个标记语言
标记语言:
以前的配置文件,大多都是使用xxxx.xml文件
YAML:以数据为中心,比json、xml等更适合做配置文件
YAML基本语法
1.使用缩进表示层级关系
2.缩进时不允许使用tab制表符键,只允许使用空格
3.缩进的空格数据不重要,只要相同层级的元素左侧对齐即可
4.大小写敏感
5.属性和值之间也要空格,如port: 8081
YAML支持的三种数据结构
1.对象:键值对的集合
多行写法
friends:
name: zhangsan
age: 20
单行写法
friends: {name: zhangsan,age: 20}
2.数组:一组按次序排列的值
用- 表示数组中的一个元素
多行写法:
pets:
- cat
- dog
- pig
单行写法:
pets: [cat,dog,pig]
3.字面量:单个的、不可再分的值
key: value
字符串默认不用加''或者""
"":不会转义字符串里面的特殊字符
name: "zhangsan \n lisi",输出:zhangsan 换行 lisi
'':会转义特殊字符
name:"zhangsan \n lisi",输出:zhangsan \n lisi
@ConfigurationProperties注解
/**
* 1.在yml中配置了
* person:
* name: zhangsan
* age: 20
* 2.还要将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties(prefix = "person"): 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix = "person":指定配置文件中哪个对象下面的所有属性进行一一映射
* 3.注意只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能,所有要使用@Component注解注释
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
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;
}
}
这里加个依赖,可以让我们在yml中输入对象的属性时,提示我们属性名称
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
二、application.properties
略
注意,idea中要配置properties文件编码为utf-8,且勾上在运行时转换为ASCII码,不然会乱码