创建springBoot工程
经过这样的步骤我们即可创建一个简单的springBooot项目,我们在它的同级目录下创建controller层,这样我们就实现了一个简单的api接口了
单击右上角即可运行
项目打包
此时运行maven的install语句即可将项目打包
之后使用cmd cd到项目编译后的路径下,运行 java -jar xxxxx.jar即可运行
运行后访问对应地址即可
自动装配原理
这部分没有理解的很深,大致认为其流程是这样的的,
1)spring事先写好了一些常用的bean,把这些bean放在一个配置文件中
2)spring创建了AutoConfigurationImportSelector类并实现了ImportSelector(spring会把实现了ImportSelector接口类的selectImports的返回值注入到IOC容器中)
3)AutoConfigurationMetadataLoader.loadMetadata 方法从 META-INF/spring-autoconfigure-metadata.properties 文件中加载自动装配的条件元数据,也就是只有满足条件的 Bean 才会被装配
4)autoConfigurationEntry.getConfigurations()方法收集所有符合条件的配置类,进行自动装配
5)Spring使用各种方法去重,去掉不需要的返回集合
6)在@EnableAutoConfiguration 注解内进行import(autoConfigurationEntry)
7)将@EnableAutoConfiguration注解封装在@SpringBootApplication注解内
8)给@SpringBootApplication注解添加@SpringBootConfiguration扫描当前项目下的注解
下面这篇文章写的很好,大家可以看看
https://xie.infoq.cn/article/eee68bfb4f1d3b9d59be1631a2
yaml写法
在springboot项目中Idea默认给我们创建的是application.properties来作为配置文件,而springboot推荐我们使用yaml来做配置,我们可以把application.properties删除掉,创建application.yaml文件
至于yaml的写法如下图所示
注意 :后面需添加空格,否则语法错误
如配置启动时的端口号
传统的对属性进行赋值
创建一个pojo类对其赋值
在test类中进行测试,发现正常运行
@SpringBootTest class MyFirstProjectApplicationTests { @Autowired Dog dog; @Test void contextLoads() { System.out.println(dog); } }
至此传统方法创建已经完成
使用yaml注入
样例1
在application.yaml中添加
dog: name: 王二花 age: 99
更改dog类中代码为
@Component @ConfigurationProperties(prefix = "dog") public class Dog { String name; int age; public Dog() { } public Dog(String name, int age) { this.name = name; this.age = age; } get/set。。。。。。。。。。。。。。。。 }
再运行测试发现成功注入
虽然可以正常运行,但是Dog类中会爆红,虽然不影响运行,但还是有些碍眼
此时只要导入如下依赖即可解决
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
样例2
在样例1的基础上创建persion类
/** * @author 化粪池堵塞的凶手 */ @Component @ConfigurationProperties(prefix = "persion") public class Persion { String name; int age; boolean happy; Date date; List list; Dog dog; get/set/构造/tostring。。。。。。。。 }
更改yaml
persion: name: 葛帅批 age: 19 happy: true date: 2001/09/13 list: - code - music - girl dog: name: 王大花 age: 99
更改测试程序
@SpringBootTest class MyFirstProjectApplicationTests { @Autowired Persion persion; @Test void contextLoads() { System.out.println(persion); } }
运行结果:
JSR303校验
首先导入starter
spring-boot-starter-validation
这里的核心注解是@Validated//数据校验
我们修改上一个案例里的persion类:
package com.example.myfirstproject.pojo; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Email; import java.util.Date; import java.util.List; /** * @author 化粪池堵塞的凶手 */ @Component @ConfigurationProperties(prefix = "persion") @Validated//数据校验 public class Persion { @Email(message = "这不符合邮箱的规则") //依赖于@Validated String name; int age; boolean happy; Date date; List list; Dog dog; public Persion(String name, int age, boolean happy, Date date, List list, Dog dog) { this.name = name; this.age = age; this.happy = happy; this.date = date; this.list = list; this.dog = dog; } }
此时再运行上面的测试会发生错误提示
向上翻可以看到:
将yaml改为如下
persion: name: 2898534520@qq.com age: 19 happy: true date: 2001/09/13 list: - code - music - girl dog: name: 王大花 age: 99
此时便可以正常运行
在实际开发中的使用流程请参考:
https://cloud.tencent.com/developer/article/1735392
配置文件的位置
配置文件可以存在的位置,优先级如图所示,当同时存在时,优先级高的生效,而优先级低的相同配置无效
1为最高 4为最低
多环境配置的切换
创建多个配置文件,都使用application-xxx.yaml格式
在里面配置不同端口号
dev
server: port: 8082
test
server: port: 8081
这时在application.yaml中配置
spring: profiles: active: test
此时启动便会加载test中的配置
配置文件可以配置什么?
配置原理
上面自动装配原理的解析我们可以通过下面这样找到其自动装配的列表
最后指向了 META-INF/spring.factories这个文件在这个位置
里面写了自动装配的包
我们继续查看,发现他们都有这两个注解
其中要特别注意的是红色框中的注解
EnableConfigurationProperties会将后面配置有ConfigurationProperties注解的类通过配置文件赋值以实现之前案例的效果
https://developer.aliyun.com/article/671047
我们继续查看EnableConfigurationProperties里的参数指向哪里
发现他们指向的类都包含ConfigurationProperties注解
springboot就是通过此来进行配置的
我们可以在xml中尝试下
发现其中的配置都可以在这里找到
特殊配置
debug: true
配置了此类之后在启动项目时便会输出日志,来告诉我们那些类自动配置了,哪些没有自动配置
生效的 Positive matches:
未生效的 Negative matches:
排除的Exclusions:
无条件的 Unconditional classes: