返回顶部
首页 > 资讯 > 后端开发 > Python >@PropertySource 无法读取配置文件的属性值解决方案
  • 370
分享到

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

2024-04-02 19:04:59 370人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

原来Person类这样写: 只写了@PropertySource注解 @Component @PropertySource(value = {"classpath:person.

原来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属性。希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

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

本文链接: https://lsjlt.com/news/128203.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作