springboot 配置 三

    xiaoxiao2025-02-13  12

    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)