springboot二:SpringBoot和Spring配置的区别

概要

在SpringBoot创建时,在resources文件夹下application.properties 文件,这个文件的作用是SpringBoot的全局配置文件。在SpringBoot中对大多数配置都按照“约定大于配置”的原则做了许多配置,但是我们在开发的过程中肯定有一些配置我们使用不上,会对配置做一些修改,所有就有全局配置这个文件。

但是在全局配置中,全局配置文件的名称只能为application(如果名称不一样,不会有效),但是有两种后缀名,一种是默认的.properties,另一种是.yml后缀,这两种形式的文件通常在一个项目中只有一个生效,只需要一个就可以。

              

application.properties和application.yml的语法格式

application.properties:是采用spring initialize新建SpringBoot项目时自动生成的配置文件,也是常常使用的配置格式。我们当初在Spring中配置Mysql的基础信息的时候,我们新建的是jdbc.properties文件来配置JDBC的基本属性。语法格式也就是:name=value的形式。

application.yml

①:基本格式:key: value。注意:键值对中间值的前面必须要有至少一个空格。

②:靠键左对齐的方式区分层次结构。

③:字符串默认可以不用引号引起来。

④:对象或者Map表示方法有两种:

        

⑤:数组或List集合有两种表达方式:

      

两种实现语法的简单比较:

@ConfigurationProperties注解的使用

在SpringBoot中通过注解@ConfigurationProperties在全局配置文件中读取数据。新建User和Address两个entity类。并实现他们的get/set、toString方法。

 

我们实现全局配置那么得添加他的依赖。

 

 我们现在User类使用@Component注解,将他标记为组件放在spring的ioc容器中;还需要使用 @ConfigurationProperties(prefix=“user”),将这个类和配置文件绑定。

 

我们在application.yml中配置User的属性。我们通过user.就会自动出现User类的属性,如果在配置已经配置依赖的情况下都不能自动显示,那么重新Build项目一下就可以了。Build->Build project。我们对User类整体赋值 如下:

 

新建测试类测试User的值是不是已经赋值完成。

 

 

运行单元测试类:发现我们对User的赋值已经存在。

 

.properties和.yml配置文件的对比,list和map的各自赋值方式的区别

我们测试application.properties的数据是不是有效前,先把application.yml的内容删除掉,因为两个配置文件只有一个起作用。最后测试结果是正确的。

 

@Value从全局配置文件获取数据

因为我们先前在application.properties中配置了一些基本的属性,我们现在注释@ConfigurationProperties注解,然后运行测试类发现没有任何数据被赋值。

 我们对User类的@ConfigurationProperties的注解去掉,在username上面添加@Value注解,如下图的对应关系。

运行测试类,如下,除了username外其他都没有赋值。

 

 

进一步测试:

 

测试数据如下:

 

 

@Value和@ConfigurationProperties的区别:

①:@ConfigurationProperties:是和JavaBean的所有属性绑定;@Value是一个一个属性绑定。

②:@ConfigurationProperties:不支持spring表达式的写法;@Value支持spring的表达式的写法 ,#{12+13}

③:@ConfigurationProperties:支持复杂类型的绑定;@Value不支持复杂类型的绑定。

 

@PropertiySource读取外部属性文件

在@ConfigurationProperties和@Value是直接在全局配置文件中获取数据,但是我们将什么数据都放在全局配置文件中,那么就会显得十分的臃肿,我们会往往将他们分离出来,比如在spring中进行数据库连接池c3p0的配置的时候,我们将数据库的基础信息抽离出来,放在jdbc.properties中,并且使用<context:property-placeholder location="classpath:jdbc.properties"/>加载;具体可以参考高并发秒杀应用:DAO层设计的数据库连接池配置那块的内容。

我们新建user.properties,将全局配置文件中的数据抽离到这个文件上来:

 

我们再在使用@ConfigurationProperties下面使用@PropertySource({"classpath:user.properties"}),来完成外部文件的导入。

运行测试单元得到如下数据:

 

 

@ImportResource引入自定义spring的配置XML文件和配置类

在Spring的使用中,当我们配置多个spring文件中时,使用如下配置文件引入。

但是在SpringBoot中默认给我们已经配置好了的,它的内部相当于有一个配置文件,那么我们想要添加配置文件,我们在SpringBoot的入口类上使用@ImportResource注解引入。

我们新建addressSpring.xml文件,我们实现xml的方式将Address注入Spring的IOC容器。对此有疑惑的可以参考我的这篇博客Spring 二:Spring Bean装配之XMl配置

 

在入口类添加注解@ImportResource。运行测试类,发现能够拿到Address的对象。

配置类:在SpringBoot中,不推荐Xml来配置,希望所有的配置都能够使用注解的形式完成,@Configuration和@Bean来完成,这个两个注解,在我的Spring的总结有总结,可以参考如下博客Spring 三:Spring Bean装配之注解形式

使用这种注解类的形式可以不用@ImportResource来引入了。

 

配置文件中使用随机值和引用变量

  可以使用${}的形式引用,random.value:表示随机值;random.int:表示int型的随机值,如果有参数表示0-n大小的随机值;random.uuid:表示随机Id值。使用${}可以引用其他变量。

运行测试用例:

 

 

profile配置文件

我们在项目中有可能对不同的方案会配置不同的全局配置文件,但是关键的时候具体启用哪一个呢,每次都要频繁的改动就比较麻烦,所以使用到profile配置。

全局配置文件必须是application.X,这个在SpringBoot中规定死了的,但是我们可以取名问 application-name.X的配置文件,默认使用application.X,如果要使用其他配置文件时:spring.profiles.active=name,来启用。

 

SpringBoot中配置文件优先级

项目的根目录/config/、项目根目录/、类路径/config/、类路径/。这四个位置的配置文件优先级依次降低;如果这四个位置都有配置文件,那么四个配置文件都会生效,但是配置文件中相同的部分,高优先级的替换低优先级的内容。

 

 

 

 

结语

学习到了:

①:SpringBoot的全局配置文件有两种表达方式 .properties和.yml结尾,但是文件名必须是application,这个是在内部写死了的;SpringBoot是约定大于配置,那么这个application必须为文件名,这是一个约定。

②:使用@ConfigurationProperties(prefix=“”) 和配置文件绑定,从配置文件中注入数据。

③:使用@Value注解,对属性的单个值的注入。

④:使用@PropertiySource。我们常常将数据配置文件从全局配置文件中抽离,那么徐亚这个注解来引入数据配置文件。

⑤:使用@ImportResource。引用自定义配置文件或者系统配置文件,这个注解使用的位置在,入口类上。

⑥:使用${}自动获取随机值和引用变量。

⑦:配置文件在项目不同位置的优先级问题。

 

posted @ 2018-12-16 15:33  轻抚丶两袖风尘  阅读(2703)  评论(0编辑  收藏  举报