springboot 配置 三

1、配置文件

-SpringBoot使用一个全局的配置文件
*application.properties
*application.yml

配置文件的作用:修改SpringBoot自动配置的默认值;由于SpringBoot在启动时自动配置,所以有了配置文件,就可以修改springboot的默认自动配置。

YAML(YAML Ain t Makerup Language)
YAML A Markup Language:是一个标记语言
YAML isn t Markup Language:不是一个标记语言
标记语言:
以前的配置文件;大多数使用的是xxxx.xml文件;
YAML:以数据为中心,比json、xml等更合适做配置文件;

proeprties写法:

server.port=8090

ymal写法:

server:
  port: 8090

2、YMAL语法:

1、基本语法

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

server:
  port: 8081
  path: /hello
2、值的写法

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

对象(属性和值)(键值对):

k:v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k:v的方式

friends:
	lastName:zhangsan
	age:20

行内写法:

friends: {lastName: zhangsan,age: 18}

数组(List、set):

用 - 值表示数组中的一个元素

pets: 
  - cat
  - dog
  - pig

行内写法

pets: [cat,dog,pig]

3、配置文件值注入

配置文件

person:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {k1: v1,k2: 12}
  lists:
    - lisi
    - zhaoliu
  dog:
    name: 小狗
    age: 2

javaBean

 @Component
@ConfigurationProperties(prefix = "person")
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;

我们可以导入配置文件处理器,以后编写配置就有提示了

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
</dependency>

3.1、Properties方式注入配置文件

# idea  配置文件person  utf-8
person.last-name=张三
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps..k2=v2
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15

其他的配置什么都不动,但是运行的话会出现中文乱码,解决方式是这样。
在这里插入图片描述
在设置里这样就不会出现乱码问题了。

3.3 用@Value()注解的方式设置注入spring容器

@Component
//@ConfigurationProperties(prefix = "as")
public class Person {

    /**
     * <bean class="Person">
     *     <property name="lastName" value="字面量/${key}总环境变量、配置文件中获取值/#{SpEL}"></property>
     * </bean>
     */
    @Value("${person.lastName}")
    private String lastName;
    @Value("#{11 * 2}")
    private Integer age;
    @Value("false")
    private Boolean boss;
    private Date birth;

上面的代码中,我们用@Value注解可以给javaBean对象设置值,它支持普通的字符串,${}从属性中获取值,#{}Spel Spring的表达式
我们比较一下ConfigurationProperties与Value的区别

@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个一个指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

4、配置文件注入值数据校验

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

    /**
     * <bean class="Person">
     *     <property name="lastName" value="字面量/${key}总环境变量、配置文件中获取值/#{SpEL}"></property>
     * </bean>
     */
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    @Email
    private String email;
person:
     lastName: zhangsan
     age: 18
     boss: false
     birth: 2017/12/12
     email: 123456
     maps: {k1: v1,k2: 12}
     lists:
       - lisi
       - zhaoliu
     dog:
       name: 小狗
       age: 2

上面两段代码是数据校验的代码,我们email写的格式明显不对,看看能巡行起来么。

Field error in object 'person' on field 'email': rejected value [123456]; codes [Email.person.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [person.email,email]; arguments []; default message [email],[Ljavax.validation.constraints.Pattern$Flag;@702ed190,org.springframework.validation.beanvalidation.SpringValidatorAdapter$ResolvableAttribute@173b9122]; default message [不是一个合法的电子邮件地址]

可以看到邮箱格式不对被拦截了。

4、@PropertySource&@ImportResource

@propertySource:加载指定的配置文件;

@Component
@PropertySource(value={"classpath:person.properties"})
@ConfigurationProperties(prefix = "person")
//@Validated
public class Person {

    /**
     * <bean class="Person">
     *     <property name="lastName" value="字面量/${key}总环境变量、配置文件中获取值/#{SpEL}"></property>
     * </bean>
     */
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

我们可以用上图的方式指定要使用的配置文件@PropertySource(value={“classpath:person.properties”})

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效。

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件也不能自动识别。真的想让Spring配置文件生效,加载进来;@ImportResource标注在配置类上。

@ImportResource(locations={"classpath:bean.xml"})
@SpringBootApplication
public class HelloWorldMainApplication {
<?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="helloService" class="com.meng.service.HelloService"></bean>
</beans>

Spring Boot给容器中添加组件的方式;推荐使用注解的方式
1、配置类=======Spring配置文件
2、使用@Bean给容器中添加组件

/**
 * 告诉spring这是一个配置类,就是来替代之前的Spring配置文件
 * 在配置文件中用<bean></bean>标签添加组件
 */
@Configuration
public class MainConfig {


    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名。
    @Bean
    public HelloService helloService(){
        return new HelloService();
    }
}
四、配置文件占位符

1、随机数

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65535]}

占位符,如果没有可以使用:指定默认的值

# idea  配置文件person  utf-8
person.last-name=张三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps..k2=v2
person.lists=a,b,c
person.dog.name=${person.last-name}的小狗${person.hello:hello}
person.dog.age=15

五、Profile

1、多Profile文件

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties
我们创建三个配置文件application.properties、application-dev.properties、
application-prod.properties。内容分别是server.port=8081、server.port=8082、server.port=8083,那么我们直接运行会执行哪个配置文件呢。

Tomcat initialized with port(s): 8081 (http)

看结果默认执行application.properties配置文件。我们在默认加载的配置文件上写入这句话:

spring.profiles.active=dev

结果:可以看到我们application-dev.properties配置文件制定的8082端口启动起来了。

Tomcat initialized with port(s): 8082 (http)
yml还有一种文档快的模式。
---
server:
  port: 8081
spring:
  profiles:
    active: prod
---
server:
  port: 8083
spring:
  profiles: dev
---
server:
  port: 8084
spring:
  profiles: prod

3、激活制定profile

1、在配置文件中指定 spring.profiles.active=dev
2、命令行:
– spring.profiles.active=dev在这里插入图片描述
加入如下命令,dev代码块,也就是8083端口启动

Tomcat initialized with port(s): 8083 (http)

我们还可以在cmd黑窗口用命令指定启动需要的代码块或者配置文件:首先先把项目打包,然后在cmd加上命令并运行jar包没查看结果
在这里插入图片描述
结果是8083端口,说明命令行指定配置文件的优先级最高。
在这里插入图片描述
3、虚拟机参数
在这里插入图片描述

 Tomcat initialized with port(s): 8083 (http)

启动的结果也是没有问题的。

6、配置文件加载位置


springboot启动会扫描一下位置的application.properties或者application.yml文件作为spring boot的默认配置文件。 -file:/config/ -file:./ -classpath:/config/ -classpath:/ 优先级由高到低,高优先级得到配置会覆盖低优先级的配置; SpringBoot会从这四个位置全部加载主配置文件;互补配置;

我们还可以通过spring.config.location该改变默认的配置文件位置。
在项目打包以后,我们可以使用命令行参数的形式,启动项目的时候来制定配置文件的新位置;制定配置文件和默认加载的这些配置文件共同起作用形成互补配置;

7、外部配置加载顺序

SpringBoot也可以从以下位置加载配置;按照优先级由高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1、命令行参数
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开;–配置项=值


2、来自java:comp/env的JNDI属性
3、java系统属性(System.getProperties())
4、操作系统环境变量
5、RandomValuePropertySource配置的random.*属性值


由jar包外向jar包内进行寻找;
优先加载带profile的
6、jar包外部的application-{profile}.properties或者application.yml(带spring.profile)配置文件
7、jar包内部的application-{profile}.properties或者application.yml(带spring.profile)配置文件


再来加载不带profile的
8、jar包外部的application.properties或者application.yml(不带spring.profile)配置文件
9、jar包内部的application.properties或者application.yml(不带spring.profile)配置文件
10、@Configuration注解类上的@PropertySource
11、通过SpringApplication.setDefaultProperties指定的默认属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值