-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=8090ymal写法:
server: port: 8090k:(空格)v:表示一对键值对(空格必须有); 以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server: port: 8081 path: /hello字面量:普通的值(数字,字符串,布尔) 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}用 - 值表示数组中的一个元素
pets: - cat - dog - pig行内写法
pets: [cat,dog,pig]配置文件
person: lastName: zhangsan age: 18 boss: false birth: 2017/12/12 maps: {k1: v1,k2: 12} lists: - lisi - zhaoliu dog: name: 小狗 age: 2javaBean
@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>其他的配置什么都不动,但是运行的话会出现中文乱码,解决方式是这样。 在设置里这样就不会出现乱码问题了。
上面的代码中,我们用@Value注解可以给javaBean对象设置值,它支持普通的字符串,${}从属性中获取值,#{}Spel Spring的表达式 我们比较一下ConfigurationProperties与Value的区别
@ConfigurationProperties@Value功能批量注入配置文件中的属性一个一个指定松散绑定(松散语法)支持不支持SpEL不支持支持JSR303数据校验支持不支持复杂类型封装支持不支持上面两段代码是数据校验的代码,我们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 [不是一个合法的电子邮件地址]可以看到邮箱格式不对被拦截了。
@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”})
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我们在主配置文件编写的时候,文件名可以是 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)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)启动的结果也是没有问题的。
我们还可以通过spring.config.location该改变默认的配置文件位置。 在项目打包以后,我们可以使用命令行参数的形式,启动项目的时候来制定配置文件的新位置;制定配置文件和默认加载的这些配置文件共同起作用形成互补配置;
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指定的默认属性。