@EnableConfigurationProperties注解使用

news2024/11/18 19:38:14

前言

当我们想把配置的内容,动态赋值到某个配置类上的时候,可以使用@EnableConfigurationProperties + @ConfigurationProperties注解

代码准备

创建配置文件prop.properties

name=ada
age=18
email=123@qq.com

创建配置类

@ComponentScan("com.test.pops")
@PropertySource("classpath:prop.properties")
public class AppConfig {

}

创建启动类

public class Main {

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
    }
}

查看@ConfigurationProperties源码

@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Indexed
public @interface ConfigurationProperties {

	/**
	 * The prefix of the properties that are valid to bind to this object. Synonym for
	 * {@link #prefix()}. A valid prefix is defined by one or more words separated with
	 * dots (e.g. {@code "acme.system.feature"}).
	 * @return the prefix of the properties to bind
	 */
	@AliasFor("prefix")
	String value() default "";

	/**
	 * The prefix of the properties that are valid to bind to this object. Synonym for
	 * {@link #value()}. A valid prefix is defined by one or more words separated with
	 * dots (e.g. {@code "acme.system.feature"}).
	 * @return the prefix of the properties to bind
	 */
	@AliasFor("value")
	String prefix() default "";

	/**
	 * Flag to indicate that when binding to this object invalid fields should be ignored.
	 * Invalid means invalid according to the binder that is used, and usually this means
	 * fields of the wrong type (or that cannot be coerced into the correct type).
	 * @return the flag value (default false)
	 */
	boolean ignoreInvalidFields() default false;

	/**
	 * Flag to indicate that when binding to this object unknown fields should be ignored.
	 * An unknown field could be a sign of a mistake in the Properties.
	 * @return the flag value (default true)
	 */
	boolean ignoreUnknownFields() default true;

}

由源码我们可以得知这个注解可以作用于类上,作用于方法上

作用于类上

@EnableConfigurationProperties注解不指定value

创建TypeConfig

@ConfigurationProperties
@Component
public class TypeConfig {

    private String name;

    private Integer age;

    private String email;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

配置类不指定value 

@ComponentScan("com.test.pops")
@PropertySource("classpath:prop.properties")
@EnableConfigurationProperties
public class AppConfig {

}

运行main方法,查看运行结果

@EnableConfigurationProperties注解指定value

TypeConfig去除@Component注解

@ConfigurationProperties
public class TypeConfig {

    private String name;

    private Integer age;

    private String email;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

配置类指定value

@ComponentScan("com.test.pops")
@PropertySource("classpath:prop.properties")
@EnableConfigurationProperties({TypeConfig.class})
public class AppConfig {

}

运行main方法,查看运行结果 

@ConfigurationProperties设置prefix

改造TypeConfig

@ConfigurationProperties(prefix = "prop")
public class TypeConfig {

    private String name;

    private Integer age;

    private String email;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

修改配置文件prop.properties

name=ada
age=18
email=123@qq.com

prop.name=tom
prop.age=17
prop.email=456@qq.com

运行main方法,查看运行结果 

使用@ConstructorBinding注解绑定到构造器上

改造TypeConfig

@ConfigurationProperties(prefix = "prop")
public class TypeConfig {

    private String name;

    private Integer age;

    private String email;

    public TypeConfig() {
    }

    @ConstructorBinding
    public TypeConfig(String name, Integer age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }
}

运行main方法,查看运行结果 

PS : @ConstructorBinding注解只能在@EnableConfigurationProperties注解指定value的时候使用

作用于方法上

修改配置类prop.properties

name=ada
age=18
email=123@qq.com

prop.name=tom
prop.age=17
prop.email=456@qq.com

method.name=bob
method.age=16
method.email=789@qq.com

创建MethodConfig

@Configuration
public class MethodConfig {

    @Bean
    @ConfigurationProperties(prefix = "method")
    public Person person() {
        return new Person();
    }

    public static class Person {
        private String name;

        private Integer age;

        private String email;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        public String getEmail() {
            return email;
        }

        public void setEmail(String email) {
            this.email = email;
        }
    }
}

运行main方法,查看运行结果 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1537573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nacos-config实现配置中心功能

快速开始 | Spring Cloud Alibaba 官方的demo照着做了一遍,走不通,报各种错误,所以自己搞一个。 jdk版本及安装 因为用的nacos是2022.0.0.0-RC2版本的,要求jdk为jdk21 Java Downloads | Oracle 下载并安装jdk21,重…

异步任务 - 1

Thread Runnable - run function Jdk - 1.5之后 Callable - 范型 其实就是方法的返回值 阻塞等待 线程池 异步非常多 内存是有限的 业务代码内 - 启动线程的方式都不能用 - 会导致资源耗尽 将所有的多线程异步任务都交给线程池进行 - 资源控制 高并发系统 - 线程池 整…

代码随想录算法训练营 DAY 17 | 110.平衡二叉树 257.二叉树的所有路径 404.左叶子之和

110.平衡二叉树 平衡二叉树的定义:任何节点的左右子树高度差绝对值不超过1 空树也是AVL! 确定遍历顺序: 求高度用后序,求深度用前序。(取决于需不需要从下往上返回结果) 先判断它是不是平衡二叉树 如果是就返回 如…

图论07-被包围的区域(Java)

7.被包围的区域 题目描述 给你一个 m x n 的矩阵 board ,由若干字符 X 和 O ,找到所有被 X 围绕的区域,并将这些区域里所有的 O 用 X 填充。 示例 1: 输入:board [["X","X","X",&qu…

【进程概念】进程状态以及僵尸进程(结合代码)

文章目录 进程状态实验观察进程的各个状态动态监视进程的脚本代码样本1:观察S(浅度睡眠)状态代码样本2:观察R(运行)状态发送kill -19 信号 观察T(暂停)状态:调试代码,观察t&#xff…

原型、原型链

如图: 判断对错: Q1:在JS 中 proto 和 constructor 属性是对象和函数都有的属性 prototype属性仅是函数对象所独有的。 由于JavaScript中一切皆对象,即函数对象也是一种对象,所以函数也拥有__proto__和constructor属性。 Q2:通过 proto 属性来连接对象…

MOSDANET

# in the figure refers to the first term of Equation 1 辅助信息 作者未提供代码

2024年【山东省安全员C证】免费试题及山东省安全员C证作业考试题库

题库来源:安全生产模拟考试一点通公众号小程序 山东省安全员C证免费试题根据新山东省安全员C证考试大纲要求,安全生产模拟考试一点通将山东省安全员C证模拟考试试题进行汇编,组成一套山东省安全员C证全真模拟考试试题,学员可通过…

Python中的环境管理与虚拟环境的使用【第148篇—虚拟环境】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的环境管理与虚拟环境的使用 在Python开发中,环境管理是至关重要的一环…

【CKA模拟题】学会JSONPath,精准定位Pod信息!

题干 For this question, please set this context (In exam, diff cluster name) kubectl config use-context kubernetes-adminkubernetesyou have a script named pod-filter.sh . Update this script to include a command that filters and displays the label with the…

轻松去除视频号水印:高效下载无痕视频教程

短视频已经成为了我们获取知识、娱乐消遣的主要途径之一。而视频号作为一个新兴的短视频平台,凭借其丰富的内容和便捷的操作界面,吸引了大量用户的关注。然而,有时候我们想要保存自己喜欢的视频,却发现视频上带有水印,…

蓝桥杯2023省赛:蜗牛|DFS暴力、DP动态规划

题目链接: 1.蜗牛 - 蓝桥云课 (lanqiao.cn) 思路说明: 首先,考虑DFS暴力解:对于蜗牛来说,它出发的起点可能是: 1、Xi竹竿底部2、从上一根杆Xi-1传送门传送到的bi, 那么他有三种方式走&…

vue2源码学习01配置rollup打包环境

1.下载rollup相关依赖 npm i rollup rollup-plugin-babel babel/core babel/preset-env --save-dev 2.新建rollup.config.js配置打包选项 //rollup可以导出一个对象,作为打包的配置文件 import babel from rollup-plugin-babel export default {input: ./src/ind…

【Linux】/proc文件系统

🔥博客主页:PannLZ 😘欢迎关注:👍点赞🙌收藏✍️留言 文章目录 /proc文件系统1.获取与进程相关的信息:/proc/ID2./proc 目录下的系统信息3. 访问/proc 文件4.动态创建/proc文件系统4.1创建目录4.2创建proc…

程序设计语言与C语言发展

我们今天开始 来讲 C语言 程序设计 首先 我们来看一下 它的课程地位 对于 计算机科学等相关专业 我们这样安排 第一学期 学习 C语言基础 第二学期 学习 C语言程序进阶 第三学期 学习 一门面向对象语言 例如 java c python等 第四学期 学习 数据结果 第五学期 操作系统 最后 学…

【教程】PLSQL查看表属性乱码解决方法

一、前言 PL/SQL是Oracle数据库的编程语言,用于编写存储过程、触发器、函数等。 今天用plsql想查看表的属性,看看各个字段的注释,可是打开一看,居然是乱码的,如下面这样 如果在使用PL/SQL查看表属性时出现乱码&…

(一)基于IDEA的JAVA基础5

Scanner的使用 使用scanner可以接收键盘上输入的数据, Scanner inputnew Scanner(System.in); 导包的方式: 什么是导包,导入的是jdk提供的java开发工具包,我们建一个java文件,psvm快捷输入后,打上new S…

预约陪诊APP定制开发方案以及流程详解

随着医疗行业的快速发展,越来越多的人开始关注自己的健康问题。然而,在看病的过程中,很多人都会感到孤独和无助。为了解决这个问题,许多医疗机构和企业推出了预约陪诊APP,旨在为用户提供一个安全、便捷的陪伴服务。本文将详细介绍…

基于Java的厦门旅游电子商务预订系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒店管理模块2.4 美食管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学生表3.2.2 学生表3.2.3 学生表3.2.4 学生表 四、系统展示五、核心代码5.1 新增景点类型5.2 查询推荐的…

【漏洞复现】金和OA IncentivePlanFulfill.aspx SQL注入漏洞

0x01 产品简介 金和OA协同办公管理系统C6软件(简称金和OA),本着简单、适用、高效的原则,贴合企事业单位的实际需求,实行通用化、标准化、智能化、人性化的产品设计,充分体现企事业单位规范管理、提高办公效…