Spring boot中PropertySource注解的使用方法详解
前言
本文将重点讲解一下spring中@propertysource注解的使用,如何通过propertysource注解加载指定的配置文件。以及propertysource注解与@configurationproperties两个注解的配合使用。下面话不多说了,来随着小编来一起学习学习吧。
1.1. propertysource注解加载指定的属性文件
spring框架提供了propertysource注解,目的是加载指定的属性文件,接下来我们看一下如何使用该注解。首先我们定义一个配置类,并在类中添加propertysource注解,如下所示:
@component @propertysource(value= {"classpath:config/jdbc-bainuo-dev.properties"},ignoreresourcenotfound=false,encoding="utf-8",name="jdbc-bainuo-dev.properties",) public class customerdatasourceconfig1 { private string url; public string geturl() { return url; } public void seturl(string url) { this.url = url; } @override public string tostring() { return "customerdatasourceconfig{" + "url='" + url + '\'' + '}'; } }
上述的代码目的是加载classpath路径中config文件中的jdbc-bainuo-dev.properties
。其中encoding用于指定读取属性文件所使用的编码,我们通常使用的是utf-8;ignoreresourcenotfound含义是当指定的配置文件不存在是否报错,默认是false;比如上文中指定的加载属性文件是jdbc-bainuo-dev.properties
。如果该文件不存在,则ignoreresourcenotfound为true的时候,程序不会报错,如果ignoreresourcenotfound为false的时候,程序直接报错。实际项目开发中,最好设置ignoreresourcenotfound为false。该参数默认值为false。
value值是设置需要加载的属性文件,可以一次性加载多个。name的值我们设置的是jdbc-bainuo-dev.properties
。这个值在springboot的环境中必须是唯一的,如果不设置,则值为:“class path resource [config/jdbc-bainuo-dev.properties]
“。
可能很多人比较纳闷,为什么是“class path resource [config/jdbc-bainuo-dev.properties]
“呢?这个就涉及到了spring中对资源文件的封装类resource。上文我们配置的value值为"classpath:config/jdbc-bainuo-dev.properties
",因此spring发现是classpath开头的,因此最终使用的是resource的子类classpathresource。如果是file开头的,则最终使用的类是filesystemresource。
了解了上文所述的resource类之后。我们再次明确一点,如果@propertysource中如果没有设置name值,则name值的生成规则是:根据value值查找到最终封装的resource子类,然后调用具体的resource子类实例对象中的getdescription方法,getdescription方法的返回值为最终的name值。
比如classpathresource类中的getdescription方法实现如下:
public string getdescription() { stringbuilder builder = new stringbuilder("class path resource ["); string pathtouse = path; if (this.clazz != null && !pathtouse.startswith("/")) { builder.append(classutils.classpackageasresourcepath(this.clazz)); builder.append('/'); } if (pathtouse.startswith("/")) { pathtouse = pathtouse.substring(1); } builder.append(pathtouse); builder.append(']'); return builder.tostring(); }
上述的name处理逻辑暂时先有个印象即可,后续会详细地跟踪源码进行讲解。
1.2. propertysource注解加载指定的属性文件测试
上文我们设置了propertysource注解来加载"classpath:config/jdbc-bainuo-dev.properties"
文件。该文件的目录结构如下图所示:
jdbc-bainuo-dev.properties文件内容如下:
spring.datasource.shareniu.url=shareniu
application.properties文件内容如下:
spring.profiles.active=dev
上面的配置文件中,spring.profiles.active
属性配置了当前使用的环境是dev。spring.datasource.shareniu.url
只是一个普通的属性,本身并没有什么特殊的含义。
下面开始书写springboot的启动类,如下所示:
@springbootapplication public class demoapplication { public static void main(string[] args) { springapplication springapplication = new springapplication(demoapplication.class); configurableapplicationcontext configurableapplicationcontext = springapplication.run(args); customerdatasourceconfig1 customerdatasourceconfig = configurableapplicationcontext .getbean(customerdatasourceconfig1.class); system.out.print(customerdatasourceconfig); } }
运行上述的代码,程序的输出如下:
customerdatasourceconfig{url='null'}
奇怪了,怎么url是空呢?propertysource注解不是已经将jdbc-bainuo-dev.properties
文件加载到当前的环境中了吗?我们不妨试一下看看jdbc-bainuo-dev.properties
中的spring.datasource.shareniu.url
属性是否可以获取到,进而从侧面验证propertysource注解已经将jdbc-bainuo-dev.properties
文件加载到当前的环境中。
修改上述启动类的代码如下:
@springbootapplication public class demoapplication { public static void main(string[] args) { springapplication springapplication = new springapplication(demoapplication.class); configurableapplicationcontext configurableapplicationcontext = springapplication.run(args); customerdatasourceconfig1 customerdatasourceconfig = configurableapplicationcontext.getbean(customerdatasourceconfig1.class); string property = configurableapplicationcontext.getenvironment().getproperty("spring.datasource.shareniu.url"); system.out.println(property); system.out.print(customerdatasourceconfig); } }
运行上述的代码,程序的输出如下:
shareniu
通过上述的代码可以看出propertysource确实是生效了。那么我们怎么将spring.datasource.shareniu.url
属性值自动注入到customerdatasourceconfig1 类中的url属性中呢?
1.3. propertysource注解读取指定文件并将属性注入到配置类
spring中提供了@value注解,用于将配置文件中的属性值读取出来并设置到相应的属性中。在这里我们学习一下如何使用@value注解。同样的还是以上文的两个类为例进行详细说明,首先需要修改customerdatasourceconfig1类,修改部分如下所示:
@component @propertysource( name="jdbc-bainuo-dev.properties",value= {"classpath:config/jdbc-bainuo-dev.properties"},ignoreresourcenotfound=false,encoding="utf-8") public class customerdatasourceconfig1 { @value("${spring.datasource.shareniu.url}") private string url; }
上述的类中,在url字段中增加了@value注解,并指定了spel表达式为${spring.datasource.shareniu.url}
。再次运行springboot启动类,控制台的输出为shareniu。表明确实可以通过@value进行属性值的注入。但是使用@value注解方式有一个不太友好的地方就是,当项目中有大量的属性进行配置的时候,我们需要一个个的在类的字段中增加@value注解,这样确实很费劲,不过我们可以通过springboot提供的@configurationproperties注解解决这个问题。
1.4. configurationproperties注解使用
@configurationproperties是类级别的注解,具体使用方式如下:
@component @configurationproperties(prefix = "spring.datasource.shareniu") @propertysource( name="jdbc-bainuo-dev.properties",value= {"classpath:config/jdbc-bainuo-dev.properties"},ignoreresourcenotfound=false,encoding="utf-8") public class customerdatasourceconfig1 { private string url; }
上述代码中,在customerdatasourceconfig1类中增加了configurationproperties注解,并且指明了属性的前缀为spring.datasource.shareniu
。这样springboot在处理的时候,会去扫描当前类中的所有字段并进行属性的查找以及组装。比如我们配置的prefix = "spring.datasource.shareniu"
,customerdatasourceconfig1类中有一个url字段,则url字段需要匹配的属性是prefix+字段=spring.datasource.shareniu.url
。
那不仅有个疑问?如果指定的字段没有找到属性怎么办呢?这个可以进行如下的配置:
@configurationproperties(prefix = "spring.datasource.shareniu",ignoreunknownfields=true,ignoreinvalidfields=true)
ignoreunknownfields:忽略未知的字段。
ignoreinvalidfields:是否忽略验证失败的字段。这个怎么理解呢?比如我们在配置文件中配置了一个字符串类型的变量,类中的字段是int类型,那肯定会报错的。如果出现这种情况我们可以容忍,则需要配置该属性值为true。该参数值默认为false。
本文暂且讲解到这里,后续的文章我们来讲解@propertysource注解如何实现读取不同环境中的配置文件,这个不同环境的文件动态切换读取,propertysource默认是不支持的,因此我们需要扩展该注解对应的源码。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读
-
Spring boot中PropertySource注解的使用方法详解
-
详解在Spring-Boot中实现通用Auth认证的几种方式
-
Spring Boot 基于注解的 Redis 缓存使用详解
-
详解Spring Boot中初始化资源的几种方式
-
Dubbo在Spring和Spring Boot中的使用详解
-
关于spring中aop的注解实现方法实例详解
-
详解在Spring-Boot中实现通用Auth认证的几种方式
-
spring boot中内嵌redis的使用方法示例
-
详解使用Spring Boot的AOP处理自定义注解
-
Spring Boot 使用@ConfigurationProperties注解获取配置文件中的值