@PropertySource 无法读取配置文件的属性值解决方案

 更新时间:2021年06月15日 10:26:20   作者:pink_soda  
这篇文章主要介绍了@PropertySource 无法读取配置文件的属性值解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

原来Person类这样写: 只写了@PropertySource注解

@Component
@PropertySource(value = {"classpath:person.properties"})
public class Person {
   
    private String lastName;
    private int age;
    private boolean boss;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
...
}

运行后找不到配置文件中的值:

在这里插入图片描述

解决方法:

加上@ConfigurationProperties注解:

@Component
@ConfigurationProperties(prefix = "person")
@PropertySource(value = {"classpath:person.properties"})
public class Person {

运行,获取到配置文件中的值:

在这里插入图片描述

为啥呢??

因为 @ConfigurationProperties(prefix = “person”)表示该类的属性值为配置中的属性值,找前缀为person的属性。

首先从全局配置文件中找是否有person对应的属性值,如果有那么就输出全局配置中的属性值;如果没有,@PropertySource意思是属性来源,从@PropertySource指定的路径中找到对应的配置文件,进行赋值。

@Value和@PropertySource读配置文件采坑留念

一、 网上查到的方式:

直接 @PropertySource加载文件@Value读取属性,

Environment.getProperty()获取属性。

结果发现@Value只能拿到"${ips}",获取不到配置文件里的属性。

@Controller
@PropertySource("classpath:queryScoreIPList.properties")
public class UserController {
 @Value("${ips}")
 private String ips;
 @Autowired
 private Environment environment;
 
 public void user() {
  System.err.println(ips);
 System.err.println(environment.getProperty("ips"));
 }
}

二、 其他方式:

两种方式加载配置文件,

@Value正常获取属性,

Environment.getProperty()获取不到属性。

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  <property name="locations">
   <list>
    <value>classpath:queryScoreIPList.properties</value>
   </list>
  </property>
</bean> 
<context:property-placeholder ignore-unresolvable="true" 
  location="classpath:queryScoreIPList.properties" /> 

三、非要@PropertySource+@Value也可以:

spring配置里装配PropertySourcesPlaceholderConfigurer或配置context:property-placeholder,

代码里@PropertySource加载配置文件,

@Value获取属性,Environment.getProperty()正常获取属性。

<!--  <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"/>  -->
<context:property-placeholder/>
@Controller
@PropertySource("classpath:queryScoreIPList.properties")
public class UserController {
 @Value("${ips}")
 private String ips;
 
 public void user() {
  System.err.println(ips);
 }
}

总结:

1、@Value从PropertySourcesPlaceholderConfigurer类的PropertySources集合中获取属性。

2、PropertySourcesPlaceholderConfigurer初始化时会将Environment作为PropertySource放到集合中。

3、@PropertySource注解只加载配置文件到Environment。

4、启动时@PropertySource注解初始化早于PropertySourcesPlaceholderConfigurer(与@PropertySource所在类和PropertySourcesPlaceholderConfigurer装配顺序无关),并且@PropertySource加载的配置在xml文件中可以正常获取。

com.controller.user.UserController.java

@Controller
@PropertySource(value="classpath:propList.properties")
public class UserController { 
 @Value("${ips}")
 private String ips;
 public void user() {
  System.err.println(ips);  
  System.err.println(environment.getProperty("ips"));
 }
}

applicationContext.xml

<context:component-scan base-package="com.dao"/>
 <context:component-scan base-package="com.controller"/>
  <context:property-placeholder location="${location}"/>  

propList.properties

location:classpath:queryScoreIPList.properties

以上代码可以正常获取queryScoreIPList.properties文件中的ips属性。希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java多线程编程之使用Synchronized块同步变量

    java多线程编程之使用Synchronized块同步变量

    我们可以通过synchronized块来同步特定的静态或非静态方法。要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传入synchronized块
    2014-01-01
  • Java IO之流的分类详解

    Java IO之流的分类详解

    这篇文章主要为大家介绍了Java IO之流的分类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Mybatis中3种关联关系的实现方法示例

    Mybatis中3种关联关系的实现方法示例

    这篇文章主要给大家介绍了关于Mybatis中3种关联关系的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者使用Mybatis具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • maven的安装配置使用详解

    maven的安装配置使用详解

    这篇文章主要介绍了maven的安装配置使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • Java构造方法和方法重载详解

    Java构造方法和方法重载详解

    大家好,本篇文章主要讲的是Java构造方法和方法重载详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Java数据结构之线段树详解

    Java数据结构之线段树详解

    线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。本文将介绍线段树的Java实现代码,需要的可以参考一下
    2022-01-01
  • Java调用Deepseek实现项目代码审查

    Java调用Deepseek实现项目代码审查

    这篇文章主要为大家详细介绍了Java如何调用Deepseek实现项目代码审查功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • SpringBoot业务逻辑异常的处理方法介绍

    SpringBoot业务逻辑异常的处理方法介绍

    本篇文章为大家展示了如何在SpringBoot中统一处理逻辑异常,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获
    2022-09-09
  • 关于Mybatis使用collection分页问题

    关于Mybatis使用collection分页问题

    项目中mybatis分页的场景是非常高频的,当使用ResultMap并配置collection做分页的时候,我们可能会遇到获取当前页的数据少于每页大小的数据问题。接下来通过本文给大家介绍Mybatis使用collection分页问题,感兴趣的朋友一起看看吧
    2021-11-11
  • 详解RSA加密算法的原理与Java实现

    详解RSA加密算法的原理与Java实现

    这篇文章主要和大家分享非对称加密中的一种算法,那就是 RSA 加密算法。本文介绍了RSA算法的原理与Java实现,感兴趣的小伙伴可以尝试一下
    2022-10-10

最新评论