Spring配置文件注入属性(将常修改的配置属性提取到外部配置文件中)

news/2024/11/29 9:56:53/

SpringBoot配置文件注入属性(将常修改的配置属性提取到外部配置文件中)

1.需求分析

​ ​ 在日常团队开发中,经常需要在本地、测试服务器、云端服务器之间来回切换进行开发与测试,而项目中可能有大量的地方需要配置服务器 IP、WebSocket 连接地址等信息,为了方便修改这些配置属性,可以将他们提取到外部配置文件中进行统一管理。这样,即使项目上线,也可以在项目所在目录直接修改配置文件信息,而不需要重新下线、修改、打包、测试、上线。

2.属性注入

​ ​ Spring为属性注入提供了一个注解 @ConfigurationProperties,其属性 prefix 用于指定属性前缀。例如:

@Data												// Lombok 工具
@ConfigurationProperties(prefix = "stu")			// 这里指定,Student 类会默认加载配置文件中,所有以 stu 开头的属性,并自动注入到对应名称的属性
public class Student {private String name;private String id;private int age;
}

​ ​ 但 @ConfigurationProperties 注解不是立即生效的,他的前提条件是,必须将该类注入为 Spring 的一个 Bean,接受 Spring 的管理,才能使用属性注入功能。一般来说,有两种方式:

  • 在该类上使用 @Component@Configure 等注解,将该类标记为 Spring 的一个 Bean

  • @EnableConfigurationProperties 注解配合使用

2.1.使用 @Component@Configure 等注解

​ ​ 这种方式最方便,并且能够同时支持默认配置文件 application.properties.yaml 格式也是一样的)与自定义配置文件(例如我自定义一个 student.properties
​ ​ 例:

@Data											     	// Lombok 工具
@ToString												// Lombok 工具
/*** 将 Student 类标记为一个 Bean 注入到 Spring 中* 这里使用 @Configure 注解也可以,因为这个注解中也包含一个 @Component* 要使用其他的,如 @Service,@Controller 也可以,但一般不会这么用*/
@Component												
@ConfigurationProperties(prefix = "stu")
public class Student {private String name;private String id;private int age;
}

​ ​ 此时,默认配置文件 application.properties 中配置对应的属性,就会自动注入到 Student 类对应的 Bean 中,如下:

# 这是 application.properties
stu.name=lisi
stu.id=5422
stu.age=22

​ ​ 测试一下:

@SpringBootTest                         // 标记为 Springboot 测试类,即可以使用 Spring 自动注入等功能
@RunWith(SpringRunner.class)            // 需要与 @SpringBootTest 注解一起使用
@Slf4j                                  // log4j 日志工具
public class MainTest {@Autowiredprivate Student student;@Testpublic void test() {if(student == null)log.info("MainTest :: test() :: student is null");elselog.info("MainTest :: test() :: student: " + student.toString());}
}// 输出结果 //
// MainTest :: test() :: student: Student(name=lisi, id=5422, age=22)

​ ​ 可见,默认配置文件中的配置属性都注入到了 Student 类中对应名称的属性上。
​ ​ 同时,我们可以使用 @PropertySource 注解指定自定义的外部配置文件:

@Data											     	// Lombok 工具
@ToString												// Lombok 工具
@Component												
@ConfigurationProperties(prefix = "stu")
/*** 指定一个自定义的配置文件: 类路径下的 extraConfig/student.properties*/
@PropertySource(value = {"classpath:extraConfig/student.properties"})
public class Student {private String name;private String id;private int age;
}

​ ​ 在项目中创建一个 resources.extraConfig 文件下,用于统一管理自定义配置文件,在下面建一个 student.properties 配置文件:
在这里插入图片描述
​ ​ 编写配置文件:

# 这是 student.properties
stu.name=zhangsan
stu.id=5403999321

  同时修改默认配置文件 applicaiton.properties

# 这是 applicaiton.properties
stu.id=123
stu.age=22

  测试一下:

@SpringBootTest                         // 标记为 Springboot 测试类,即可以使用 Spring 自动注入等功能
@RunWith(SpringRunner.class)            // 需要与 @SpringBootTest 注解一起使用
@Slf4j                                  // log4j 日志工具
public class MainTest {@Autowiredprivate Student student;@Testpublic void test() {if(student == null)log.info("MainTest :: test() :: student is null");elselog.info("MainTest :: test() :: student: " + student.toString());}
}// 输出结果 //
// MainTest :: test() :: student: Student(name=zhangsan, id=123, age=22)

  可以发现,Student 类的 Bean 同时读取了 application.prepertiesstudent.properties 配置文件中对应的属性值,但 application.preperties 的优先级更高,当 application.preperties 中没有的属性,Spring 才会到自定义的 student.properties 中去找。

2.2.使用 @EnableConfigurationProperties 注解

  该注解也是将对应的实体类,标注为 Spring 的一个 Bean 交给它去管理,因此,只要是 @EnableConfigurationProperties 指定的类,不需要 @Component 等注解,一样会被 Spring 管理,并且其 @ConfigurationProperties 也会生效。
  不过要注意以下几点:

  • 如果要使用 @EnableConfigurationProperties 注解在其他类控制该实体类的注入,那么在该实体类上,就不要再使用 @Component 等注解了,虽然不会冲突,但这么做就没有什么意义了,不符合逻辑。
  • 使用 @EnableConfigurationProperties 注解,则读取不到自定义配置文件中的属性值,只能读到默认配置文件 application.preperties 中的属性值
  • 一般不会使用这种方式, @EnableConfigurationProperties 注解一般是第三方源代码提供给用户的注入方式

  测试一下:

@SpringBootApplication
/*** 使用 @EnableConfigurationProperties 注解注入 Student 类,使其* @ConfigurationProperties 注解生效*/
@EnableConfigurationProperties(Student.class)		
public class MainApplication {public static void main(String[] args) {SpringApplication.run(MainApplication.class, args);}
}
@Data
@ToString
//@Component            // 不再使用 @Component 注解
@ConfigurationProperties(prefix = "stu")
@PropertySource(value = {"classpath:extraConfig/student.properties"})
public class Student {private String name;private String id;private int age;
}
@SpringBootTest                         // 标记为 Springboot 测试类,即可以使用 Spring 自动注入等功能
@RunWith(SpringRunner.class)            // 需要与 @SpringBootTest 注解一起使用
@Slf4j                                  // log4j 日志工具
public class MainTest {@Autowiredprivate Student student;@Testpublic void test() {if(student == null)log.info("MainTest :: test() :: student is null");elselog.info("MainTest :: test() :: student: " + student.toString());}
}// 输出结果 //
// MainTest :: test() :: student: Student(name=null, id=123, age=22)

  由结果可见,使用 @EnableConfigurationProperties(Student.class),Spring 在注入 Student 类的 Bean 时,读取到了 application.properties 中的相应的配置属性,但 student.properties 里配置的 stu.namestu.id 就读取不到了。


http://www.ppmy.cn/news/374269.html

相关文章

MyBatis-Plus中的LambdaQueryWrapper之动态添加不确定个数的or条件

MyBatis-Plus中的LambdaQueryWrapper之动态添加不确定个数的or条件 在使用 MyBatis-Plus 的 LambdaQueryWrapper 时&#xff0c;如果对应方法的入参是个数不确定的&#xff0c;比如List<String> bridgeNames&#xff0c;而且需要对其中的所有变量&#xff0c;使用 or 操作…

Power-BI深受认可软博会荣获杰出企业奖

2015年5月27日—29日&#xff0c;第十九届中国国际软件博览会在北京展览馆举行。软博会由工业和信息部主办&#xff0c;国家发展和改革委员会、科学技术部、国家外国专家局和北京市人民政府参与&#xff0c;中国软件行业协会等单位承办。软博会历史悠久、规格层次高、内容权威、…

101个著名的管理学及心理学效应

1、阿基米德与酝酿效应 在古希腊&#xff0c;国王让人做了一顶纯金的王冠&#xff0c;但他又怀疑工匠在王冠中掺了银子。可问题是这顶王冠与当初交给金匠的一样重&#xff0c;谁也不知道金匠到底有没有捣鬼。国王把这个难题交给了阿基米德。阿基米德为了解决这个问题冥思苦想,他…

[精简整理]疏通中国历史脉络——“元、明、清(1840鸦片战争止)”篇

元世祖忽必烈即位以前&#xff0c;就重视吸收汉族的读书人&#xff0c;帮助筹划朝政大事。他重用一个汉族谋士刘秉忠。忽必烈称帝和定国号为元&#xff0c;都是刘秉忠的主意。后来&#xff0c;刘秉忠又向忽必烈荐引了一些朋友、学生&#xff0c;也一个个担任了元朝初年的重要官…

明朝皇帝在位时间

明朝&#xff08;1368年―1644年 &#xff09;&#xff0c;是中国历史上一个由汉族建立的王朝。初期建都南京&#xff0c;明成祖时期定都北京。传十六帝、十七朝、十二世&#xff0c;共计276年 。 任姓名年号庙号谥号生卒年份在位年份享年继位年纪在位时长陵寝世系一朱元璋洪武…

中国古典十大悲剧

一.《窦娥冤》  《窦娥冤》——元关汉卿 山阴书生窦天章因无力偿还蔡婆的高利贷&#xff0c;把七岁的女儿窦娥送给蔡婆当童养媳来抵债。窦娥长大后与蔡婆儿子成婚&#xff0c;婚后两年蔡子病死。后来蔡婆向赛卢医索债&#xff0c;被赛卢医骗至郊外谋害&#xff0c;为流氓张驴…

计算机云开头的词语,云字开头的成语

以下是小编给大家整理的云字开头的成语的内容&#xff0c;欢迎大家查看。 云程发轫&#xff1a;云程&#xff1a;青云万里的路程;发轫&#xff1a;启车行进&#xff0c;比喻事业的开端。旧时祝人前程远大的颂辞。 云过天空&#xff1a;比喻事情已经过去&#xff0c;一切恢复平静…

《棋经十三篇》

《棋经十三篇》 《棋经十三篇》是宋朝时出现的一部在我国围棋发展史上占有特殊地位的著作。   《棋经十三篇》的价值&#xff0c;首先在于它的系统性。我国古典围棋理论&#xff0c;从尹文子和太叔文子算起&#xff0c;中经班固《弈旨》、马融《围棋赋》等&#xff0c;到了敦…