IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;
选择我们需要的模块;
向导会联网创建Spring Boot项目;
默认生成的Spring Boot项目;
主程序已经生成好了,我们只需要我们自己的逻辑
生成的resources文件夹中目录结构
SpringBoot使用一个全局的配置文件,配置文件名是固定的; application.properties 和application.yml
配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;
其中后缀名是yml的全写是yaml
YAML(YAML Ain’t Markup Language)可以理解成
YAML A Markup Language:是一个标记语言
或者
YAML isn’t Markup Language:不是一个标记语言;
标记语言:
以前的配置文件;大多都使用的是 xxxx.xml文件;
YAML:以数据为中心,比json、xml等更适合做配置文件;
YAML:配置例子
server:
port: 8081
之前xml的对应配置例子
<server>
<port>8081</port>
</server>
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;
字面量:普通的值(数字,字符串,布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
‘’:单引号;会转义特殊字符,特殊字符终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
对象、Map(属性和值)(键值对)
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式
friends:
lastName: zhangsan
age: 20
行内写法:
friends: {lastName: zhangsan,age: 18}
pets:
‐ cat
‐ dog
‐ pig
行内写法
pets: [cat,dog,pig]
首先编写的配置文件是
person:
lastName: hello
age: 18
boss: false
birth: 2019/12/26
maps: {k1: v1,k2: v2}
lists:
- lisi
- zhangsan
dog:
name: 狗
age: 12
对应的JavaBean是
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉springboot将本类中的所有的属性和配置文件中相关的配置进行绑定
* prefix = "person":以配置文件中哪个下面的所有属性进行一一映射
* 只有这个组件是容器的组件,才能让容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
@PropertySource("classpath:application.yaml")
public class Person
{
private String lastName;
private Integer age;
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
在测试单元里面测试
/**
* spring boot单元测试
* 可以在测试期间很方便的类似编码一样进行自动注入等容器的功能
*/
@SpringBootTest
class TestApplicationTests
{
@Autowired
Person person;
@Test
void contextLoads()
{
System.out.println("================================================");
System.out.println(person);
}
}
person.last-name=小杨
person.age=18
person.birth=2020/12/26
person.boss=false
person.maps.v1=擎天柱
person.maps.v2=28
person.lists=1,2,3
person.dog.name=狗狗
person.dog.age=5
只不过会出现中文乱码的问题,参考这篇文章
之前使用的是@ConfigurationProperties(prefix = “person”)对配置文件中的数据进行绑定,现在改成@Value
这个和之前在spring中的Value的作用和用法都是一样的
之前使用spring配置bean的时候差不多是这样
<bean class="Person">
<property name="lastname" value=""></property>
</bean>
现在的@Value和上面的value的用法差不多,也是可以写字面量,${key}从环境变量里面取值,#{Spel}表达式获取结果
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法,就是属性名的匹配规则,比如person.firstName:使用标准方式 ,person.first-name:大写用, person.first_name:大写用_ ,上面的三种方式,松散语法中认为他们是同一个变量) | 支持 | 不支持 |
SpEL (spring表达式语言) | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
最大的区别:复杂类型封装,比如map的封装 | 支持 | 不支持 |
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value; 如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
JSR303数据校验就是对于绑定的数据注入的时候校验他们是否符合需求,比如是否符合是邮箱地址
增加@Validated 和@email进行校验
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person
{
@email
private String lastName;
private Integer age;
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
加载指定的配置文件;
之前使用的 @ConfigurationProperties(prefix = “”)默认是从全局配置文件中获取值
但是如果我们将所有的东西都写在配置文件中,那么配置文件会有太多的数据,所以我们将部分的JavaBean之类的数据提取出来,放在其他的配置文件中,这时候获取其他的配置文件中的值就要使用到这个注解
@Component
@ConfigurationProperties(prefix = "person")
//@Validated
@PropertySource(value = "classpath:person.properties")
public class Person
{
// @Value("哆啦A梦")
// @email
private String lastName;
// @Value("${person.age}")
private Integer age;
// @Value("#{1==1}")
private boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
导入Spring的配置文件,让配置文件里面的内容生效;
Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上
现在我们想直接加在主配置类上
@ImportResource(locations ={"classpath:bean.xml"} )
@SpringBootApplication
public class TestApplication
{
public static void main(String[] args)
{
SpringApplication.run(TestApplication.class, args);
}
}
spring的配置文件bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="dog" class="jane.test.bean.Dog"></bean>
</beans>
测试
@Autowired
ApplicationContext ioc;
@Test
public void test()
{
boolean dog = ioc.containsBean("dog");
System.out.println(dog);
}
结果是true的
上面的例子中,想在spring的容器中添加组件,spring boot不推荐写一个sprig的配置文件然后再加载进去的
spring boot推荐的是使用配置类,这个配置类可以另外写,也可以写在主配置类上
这个配置类就相当于之前spring的配置文件一样的
package jane.test.jane.config;
import jane.test.bean.Dog;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author jane
* @create 2020-08-05 1:48
*
* @Configuration:就是指明当前类是一个配置类,
* 就是用来替代之前的spring的配置文件
*/
@Configuration
public class Myconfig
{
//将方法中返回值添加到容器中,容器中的这个组件的默认的id就是方法名
@Bean
public Dog dog()
{
System.out.println("增加了一个狗");
return new Dog();
}
}
${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
person.last-name=小杨${random.uuid}
person.age=${random.int}
person.birth=2020/12/26
person.boss=false
person.maps.v1=擎天柱
person.maps.v2=28
person.lists=1,2,3
person.dog.name=${person.last-name}的狗
person.dog.age=5