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

总结

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

(0)

相关推荐

  • spring boot 的常用注解使用小结

    @RestController和@RequestMapping注解 4.0重要的一个新的改进是@RestController注解,它继承自@Controller注解.4.0之前的版本,Spring MVC的组件都使用@Controller来标识当前类是一个控制器servlet.使用这个特性,我们可以开发REST服务的时候不需要使用@Controller而专门的@RestController. 当你实现一个RESTful web services的时候,response将一直通过response

  • SpringBoot使用自定义注解实现权限拦截的示例

    本文介绍了SpringBoot使用自定义注解实现权限拦截的示例,分享给大家,具体如下: HandlerInterceptor(处理器拦截器) 常见使用场景 日志记录: 记录请求信息的日志, 以便进行信息监控, 信息统计, 计算PV(page View)等 性能监控: 权限检查: 通用行为: 使用自定义注解实现权限拦截 首先HandlerInterceptor了解 在HandlerInterceptor中有三个方法: public interface HandlerInterceptor { //

  • 详解Spring Boot 自定义PropertySourceLoader

    SpringBoot 的配置文件内置支持 properties.xml.yml.yaml 几种格式,其中 properties和xml 对应的Loader类为 PropertiesPropertySourceLoader ,yml和yaml 对应的Loader类为 YamlPropertySourceLoader. 观察这2个类可以发现,都实现自接口 PropertySourceLoader .所以我们要新增支持别的格式的配置文件,就可以通过实现接口 PropertySourceLoader 来

  • Spring Boot 项目搭建教程及注解

    Spring Boot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域成为领导者 特点: 1. 创建独立的Spring应用程序 2. 嵌入的Tomcat,无需部署WAR文件 3. 简化Maven配置 4. 自动配置Spring 5. 提供生产就绪型功能,如指标,健康检查和外部配置

  • 零基础入门学习——Spring Boot注解(一)

    声明bean的注解: @Component组件,没有明确角色的bean @Service,在业务逻辑层(service)中使用 @Repository,在数据访问层(dao)中使用 @Controller,在展现层中使用 @Configuration声明配置类 实体类无需添加注解,因为并不需要"注入"实体类 指定Bean的作用域的注解: @Scope("prototype") 默认值为singleton 可选值prototype.request.session.gl

  • SpringBoot中自定义注解实现控制器访问次数限制实例

    今天给大家介绍一下SpringBoot中如何自定义注解实现控制器访问次数限制. 在Web中最经常发生的就是利用恶性URL访问刷爆服务器之类的攻击,今天我就给大家介绍一下如何利用自定义注解实现这类攻击的防御操作. 其实这类问题一般的解决思路就是:在控制器中加入自定义注解实现访问次数限制的功能. 具体的实现过程看下面的例子: 步骤一:先定义一个注解类,下面看代码事例: package example.controller.limit; import org.springframework.core.

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

    前言 本文将重点讲解一下Spring中@PropertySource注解的使用,如何通过PropertySource注解加载指定的配置文件.以及PropertySource注解与@ConfigurationProperties两个注解的配合使用.下面话不多说了,来随着小编来一起学习学习吧. 1.1. PropertySource注解加载指定的属性文件 Spring框架提供了PropertySource注解,目的是加载指定的属性文件,接下来我们看一下如何使用该注解.首先我们定义一个配置类,并在类中

  • Spring Boot中使用Spring-data-jpa的配置方法详解

    为了解决这些大量枯燥的数据操作语句,我们第一个想到的是使用ORM框架,比如:hibernate.通过整合Hibernate之后,我们以操作Java实体的方式最终将数据改变映射到数据库表中. 为了解决抽象各个Java实体基本的"增删改查"操作,我们通常会以泛型的方式封装一个模板Dao来进行抽象简化,但是这样依然不是很方便,我们需要针对每个实体编写一个继承自泛型模板Dao的接口,再编写该接口的实现.虽然一些基础的数据访问已经可以得到很好的复用,但是在代码结构上针对每个实体都会有一堆Dao的

  • SpringMVC中常用注解与使用方法详解

    MVC简介 MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写, 是一种用于设计创建 Web 应用程序表现层的模式. Model(模型): 通常指的就是我们的数据模型.作用一般情况下用于封装数据. View(视图): 通常指的就是我们的 jsp 或者 html.作用一般就是展示数据的. 通常视图是依据模型数据创建的. Controller(控制器): 是应用程序中处理用户交互的部分.作用一般就是处理程序逻辑的.

  • Spring Boot 中PageHelper 插件使用配置思路详解

    使用思路 1.引入myabtis和pagehelper依赖 2.yml中配置mybatis扫描和实体类 这2行代码 pageNum:当前第几页 pageSize:显示多少条数据 userList:数据库查询的数据数据列表 PageHelper.startPage(pageNum, pageSize); PageInfo pageInfo = new PageInfo(userList); 最后返回一个pageInfo 对象即可,pageInfo 这个对象中只有数据一些信息,但是,没有成功失败的状

  • struts2中使用注解配置Action方法详解

    使用注解来配置Action可以实现零配置,零配置将从基于纯XML的配置转化为基于注解的配置.使用注解,可以在大多数情况下避免使用struts.xml文件来进行配置. struts2框架提供了四个与Action相关的注解类型,分别为ParentPackage.Namespace.Result和Action. ParentPackage:ParentPackage注解用于指定Action所在的包要继承的父包.该注解只有一个value参数.用于指定要继承的父包. 示例: 使用ParentPackage

  • Spring Boot中lombok的安装与使用详解

    前言 众所周知Spring Boot是非常高效的开发框架,lombok是一套代码模板解决方案,将极大提升开发的效率,这里介绍给大家使用.文中详细介绍了lombok的安装与使用教程,话不多说了,来一起看看详细的介绍吧. 1. Lombok Lombok想要解决了的是在我们实体Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不会用到,但是某些时候仍然需要复写,以期方便使用的方法:在使用Lombok之后,将由其来自动帮你实现代码生成,注意,其是在运行过程中

  • Spring Boot中slf4j日志依赖关系示例详解

    前言 SpringBoot底层使用的是slf4j+logback来进行日志记录 把其他common-logging.log4j.java.util.logging转换为slf4j 下面这篇文章主要给大家介绍了关于Spring Boot slf4j日志依赖关系的相关内容,下面话不多说了,来一起看看详细的介绍吧 底层依赖关系 关系如何转化 底层通过偷梁换柱的方法,用jcl.jul.log4j中间转换包进行转化 如果要引入其他框架,必须将其中默认日志依赖剔除 SpringBoot从maven依赖中剔除

  • Spring Boot 中使用cache缓存的方法

    一.什么是缓存 Cache Cache 一词最早来自于CPU设计 当CPU要读取一个数据时,首先从CPU缓存中查找,找到就立即读取并送给CPU处理:没有找到,就从速率相对较慢的内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存.正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右),也就是说CPU下一次要读取的数据90%都在CPU缓存中,只有大约10%需要从内存读取.这大大节省了CPU直接读取内存的

  • Spring Boot中自定义注解结合AOP实现主备库切换问题

    摘要:本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的压力,在本篇文章中主要记录在Spring Boot中通过自定义注解结合AOP实现直接连接备库查询. 一.通过AOP 自定义注解实现主库到备库的切换 1.1 自定义注解 自定义注解如下代码所示 import java.lang.annotation.ElementType; import java.la

  • Spring Boot中@Conditional注解介绍

    目录 1. @Conditional 注解 2. Springboot扩展 1. @Conditional 注解 @Conditional注解是Spring-context模块提供了一个注解,该注解的作用是可以根据一定的条件来使@Configuration注解标记的配置类是否生效,代码如下: // // Source code recreated from a .class file by IntelliJ IDEA // (powered by FernFlower decompiler) /

随机推荐