Spring boot中PropertySource注解的使用方法详解

 更新时间:2017年12月13日 16:13:38   作者:分享牛  
这篇文章主要给大家介绍了关于Spring boot中PropertySource注解的使用方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧。

前言

本文将重点讲解一下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默认是不支持的,因此我们需要扩展该注解对应的源码。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • java简单实现数组中的逆序对

    java简单实现数组中的逆序对

    这篇文章主要为大家详细介绍了java简单实现数组中的逆序对,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • 使用vscode搭建javaweb项目的详细步骤

    使用vscode搭建javaweb项目的详细步骤

    我个人是很喜欢VsCode的,开源免费、功能全面,所以为了方便,我把我几乎所有的运行都集成到了VsCode上来,JavaWeb也不例外,下面这篇文章主要给大家介绍了关于使用vscode搭建javaweb项目的相关资料,需要的朋友可以参考下
    2022-11-11
  • 详解spring boot配置单点登录

    详解spring boot配置单点登录

    本篇文章主要介绍了详解spring boot配置单点登录,常用的安全框架有spring security和apache shiro。shiro的配置和使用相对简单,本文使用shrio对接CAS服务。
    2017-03-03
  • SpringBoot与SpringMVC第一讲

    SpringBoot与SpringMVC第一讲

    SpringMVC全名应该叫做SpringWebMVC,它其实是基于servlet来构建的一个原始web框架从一开始就包含在了spring框架中,下面通过实例代码给大家介绍SpringBoot与SpringMVC的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • Java使用html2image将html生成缩略图图片的实现示例

    Java使用html2image将html生成缩略图图片的实现示例

    本文主要介绍了Java使用html2image将html生成缩略图图片的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-12-12
  • Java中byte、byte数组与int、long的转换详解

    Java中byte、byte数组与int、long的转换详解

    这篇文章分别给大家介绍了Java中byte和int之间的转换、Java中 byte数组和int之间的转换、Java中byte数组和long之间的转换以及整理了整体工具类的源码,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-02-02
  • springboot3.2整合mybatis-plus详细代码示例

    springboot3.2整合mybatis-plus详细代码示例

    这篇文章主要给大家介绍了关于springboot3.2整合mybatis-plus的相关资料,Spring Boot是一个非常流行的Java Web框架,可以快速地搭建Web应用程序,需要的朋友可以参考下
    2023-12-12
  • 详解Java分布式系统中session一致性问题

    详解Java分布式系统中session一致性问题

    这篇文章主要介绍了Java分布式系统中session一致性问题,对分布式系统感兴趣的同学,要仔细看一下
    2021-04-04
  • elasticsearch集群cluster示例详解

    elasticsearch集群cluster示例详解

    这篇文章主要为大家介绍了elasticsearch集群cluster示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • JavaWeb 网上书店 注册和登陆功能案例详解

    JavaWeb 网上书店 注册和登陆功能案例详解

    这篇文章主要介绍了JavaWeb 网上书店 注册和登陆功能,结合具体案例形式详细分析了JavaWeb 网上书店 注册和登陆功能具体实现步骤、操作技巧与注意事项,需要的朋友可以参考下
    2019-08-08

最新评论