SpringBoot框架:Initializer快速创建,配置文件,YAML语法,application.properties注入,@value绑定数据,加载配置文件三种方法,配置文件中的占位符

IDEA中Spring Initializer快速创建Spring Boot项目

IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;
选择我们需要的模块;
向导会联网创建Spring Boot项目;
默认生成的Spring Boot项目;
主程序已经生成好了,我们只需要我们自己的逻辑
生成的resources文件夹中目录结构

  1. static:保存所有的静态资源; js css images;
  2. templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页 面);可以使用模板引擎(freemarker、thymeleaf);
  3. application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

配置文件

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>

YAML语法

基本语法

k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
属性和值也是大小写敏感;

值的写法

  1. 字面量:普通的值(数字,字符串,布尔)
    k: v:字面直接来写;
    字符串默认不用加上单引号或者双引号;
    “”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
    name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
    ‘’:单引号;会转义特殊字符,特殊字符终只是一个普通的字符串数据
    name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi

  2. 对象、Map(属性和值)(键值对)
    k: v:在下一行来写对象的属性和值的关系;注意缩进
    对象还是k: v的方式

friends: 
	lastName: zhangsan          
	age: 20

行内写法:

friends: {
    
    lastName: zhangsan,age: 18}
  1. 数组(List、Set)
    用- 值表示数组中的一个元素
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);
    }

}

结果
在这里插入图片描述

改成application.properties注入

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

只不过会出现中文乱码的问题,参考这篇文章

使用@value绑定数据

之前使用的是@ConfigurationProperties(prefix = “person”)对配置文件中的数据进行绑定,现在改成@Value
这个和之前在spring中的Value的作用和用法都是一样的
之前使用spring配置bean的时候差不多是这样

<bean class="Person">
	<property name="lastname" value=""></property>
</bean>

现在的@Value和上面的value的用法差不多,也是可以写字面量,${key}从环境变量里面取值,#{Spel}表达式获取结果

@Value获取值和@ConfigurationProperties获取值

@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;

@PropertySource&@ImportResource&@Bean

@PropertySource

加载指定的配置文件;
之前使用的 @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;

@ImportResource

导入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

@Bean

上面的例子中,想在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

猜你喜欢

转载自blog.csdn.net/qq_43416157/article/details/107748624