Springboot中PropertySource注解的使用
https://blog.csdn.net/qq_30739519/article/list/3
注解
https://blog.csdn.net/qq_30739519/article/details/78791142
https://blog.csdn.net/qq_30739519/article/details/78800490
https://blog.csdn.net/qq_30739519/article/details/78779317
Springboot集成Swagger2
摘要:Springboot中PropertySource注解的使用一文中,详细讲解了PropertySource注解的使用,通过PropertySource注解去加载指定的资源文件、然后将加载的属性注入到指定的配置类,@value以及@ConfigurationProperties的使用。但是也遗留一个问题,PropertySource注解貌似是不支持多种环境的动态切换?这个问题该如何解决呢?我们需要从源码中看看他到底是否支持。
————————————————
版权声明:本文为CSDN博主「分享牛」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30739519/java/article/details/78800490
摘要:本文重点讲解一下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默认是不支持的,因此我们需要扩展该注解对应的源码。
————————————————
版权声明:本文为CSDN博主「分享牛」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30739519/java/article/details/78791142
Springboot中PropertySource注解的使用的更多相关文章
- SpringBoot 中常用注解
本篇博文将介绍几种SpringBoot 中常用注解 其中,各注解的作用为: @PathVaribale 获取url中的数据 @RequestParam 获取请求参数的值 @GetMapping 组合注 ...
- SpringBoot 中常用注解@PathVaribale/@RequestParam/@GetMapping介绍
SpringBoot 中常用注解@PathVaribale/@RequestParam/@GetMapping介绍 本篇博文将介绍几种如何处理url中的参数的注解@PathVaribale/@Requ ...
- SpringBoot 中常用注解@Controller/@RestController/@RequestMapping的区别
SpringBoot中常用注解@Controller/@RestController/@RequestMapping的区别 @Controller 处理http请求 @Controller //@Re ...
- SpringBoot 中常用注解@Controller/@RestController/@RequestMapping介绍
原文 SpringBoot 中常用注解 @Controller/@RestController/@RequestMapping介绍 @Controller 处理http请求 @Controller / ...
- springboot中常用注解总结
1.@RestController(组合注解):标注在类上,等价于@Controller和@Responsebody @Controller:将该类标记为Controller层的类,并且注入到Spri ...
- SpringBoot中常用注解@Controller/@RestController/@RequestMapping的区别
@Controller 处理http请求 @Controller //@ResponseBody public class HelloController { @RequestMapping(valu ...
- SpringBoot中MongoDB注解概念及使用
spring-data-mongodb主要有以下注解 @Id 主键,不可重复,自带索引,可以在定义的列名上标注,需要自己生成并维护不重复的约束.如果自己不设置@Id主键,mongo会自动生成一个唯一主 ...
- SpringBoot中常见注解含义总结
@RestController @RestController被称为一个构造型(stereotype)注解.它为阅读代码的开发人员提供建议.对于Spring,该类扮演了一个特殊角色.它继承自@Cont ...
- springboot中Properties注解的实现
关于@PropertySources注解的理解:http://www.imooc.com/article/252889?block_id=tuijian_wz public interface Pro ...
随机推荐
- 利用COM组件实现对WORD书签各种操作大全,看这一篇就够了
有个需求是,程序导出一份word报告,报告中有各种各样的表格,导出时还需要插入图片. 脑海中迅速闪过好几种组件,openxml组件,com组件,npoi.为了减少程序画复杂表格,我们选用了com组件+ ...
- Kafka超详细学习笔记【概念理解,安装配置】
目录 本篇要点 Kafka介绍 作为流处理平台的三种特性 主要应用 四个核心API 基本术语 快速开始 安装配置Zookeeper 下载kafka 配置文件 Windows的命令 启动Zookeepe ...
- Error:(18) error: '#FFFF782' is incompatible with attribute android:endColor (attr) color. --Android
android studio 编译是报如下错误: Error:(18) error: '#FFFF782' is incompatible with attribute android:endCol ...
- 麦格理银行借助DataStax Enterprise (DSE) 驱动数字化转型
在本文中,我们将介绍DataStax Enterprise是如何助力澳大利亚最大的投资银行麦格理银行的数字银行,实现了实时分析和自然语言搜索等多项功能,并为用户提供了个性化的用户体验. "D ...
- 毕业三年,如何达到月薪30K?我想跟你聊聊!!
写在前面 很多读者私信问我,自己工作三多年了,随着工作年限的不断增长,感觉自己的技术水平与自己的工作年限严重不符.想跳槽出去换个新环境吧,又感觉自己的能力达不到心仪公司的标准,即使投了简历也没人来通知 ...
- 怎么判断map不为空
public static void main(String[] args) { Map<String, String> map = new HashMap<String, Stri ...
- Spring源码深度解析之Spring MVC
Spring源码深度解析之Spring MVC Spring框架提供了构建Web应用程序的全功能MVC模块.通过策略接口,Spring框架是高度可配置的,而且支持多种视图技术,例如JavaServer ...
- Centos7上以RPM包方式安装Oracle 18c XE
Centos7上以RPM包方式安装Oracle 18c XE 安装阿里云 YUM 源 https://opsx.alibaba.com/mirror?lang=zh-CN 一.安装oracle数据库 ...
- 熬夜肝了一周!总结了这套对标阿里P8的java秘籍,限时发布3天!
前言 最近老是有粉丝私信我说感觉自己学java越来越难了,这其中有刚毕业的应届生说自己的技术找不到满意的工作,也有在学校的大学习说找不到学习方式,更多的是正在工作的java开发人员说是现在的技术更新太 ...
- android中VideoView播放sd卡上面的视频
(1)videoView组件只支持MP4和3gp格式的视屏播放,如果想播放其它视屏格式的文件,还得开发能够播放的视屏播放器 (2)videoView组件功能比较单一,如果想开发功能丰富的播放器,还得重 ...