Spring复习:(56)PropertySourcePlaceholderConfigurer的工作原理

news2024/11/24 2:30:12

PropertySourcePlaceholderConfigurer的用途:通过配置文件(比如.properties文件)给bean设置属性,替代属性占位符
示例:

属性配置文件

spring.datasource.url=jdbc:mysql://xxx.xxx.xxx.xxx/test
spring.datasource.username=root
spring.datasource.password=xxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd">



    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="locations" value="classpath:cn/edu/tju/jdbc.properties"/>
    </bean>

    <bean id="dataSource"
          class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${spring.datasource.driver-class-name}"/>
        <property name="url" value="${spring.datasource.url}"/>
        <property name="username" value="${spring.datasource.username}"/>
        <property name="password" value="${spring.datasource.password}"/>
    </bean>


</beans>


因为在spring配置文件定义了类型为PropertySourcesPlaceholderConfigure的BeanFactoryPostProcessor,所以在容器创建dataSource这个bean时,它会对bean定义进行处理,将属性中的占位符替换为实际值。

工作原理:
当实例化PropertySourcesPlaceholderConfigurer时,通过属性注入,把bean配置时指定的属性文件名字对应的Resource保存到其父类的locations成员变量
在这里插入图片描述
因为PropertySourcesPlaceholderConfigurer是BeanFactoryPostProcessor,所以其postProcessBeanFactory方法会被调用,这个方法代码如下:
在这里插入图片描述
在这里插入图片描述
其中调用了processProperties方法,该方法代码如下:
在这里插入图片描述
从上图看出,它调用了父类的doProcessProperties方法:
在这里插入图片描述
其中调用了BeanDefinitionVistor的局部变量的visitBeanDefinition方法,这个方法代码如下:
在这里插入图片描述
可以看到它首先判断BeanDefinition中是否存在属性值,如果存在,则调用visitPropertyValues方法来进行处理,这个方法代码如下:
在这里插入图片描述
其中调用的resolveValue方法代码如下:
在这里插入图片描述
在这里插入图片描述
其中调用的resolveStringValue方法代码如下:
在这里插入图片描述
可以看到它调用了成员变量valueResolver来对属性进行处理,而此处的valueResolver是创建BeanDefinitionReader时通过lambda表达式传进来的,如下图
在这里插入图片描述
因为this.ignoreUnresolvablePlaceholders为false,所以会执行propertyResolver.resolveRequiredPlaceholders(strVal),这个方法代码如下:
在这里插入图片描述
它调用的doResolvePlaceholders代码如下:
在这里插入图片描述
它调用的辅助类的replacePlaceholders方法,代码如下:
在这里插入图片描述

它调用的parseStringValue代码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其中,`

String propVal = placeholderResolver.resolvePlaceholder(placeholder);

这句完成了真正的属性解析,这里的placeholderResolver是通过lambda表达式传进来的,如下图:
在这里插入图片描述
此处的getPropertyAsRawString代码如下:
在这里插入图片描述
它调用的getProperty方法代码如下:
在这里插入图片描述
从上图可以看出,这个方法中会遍历拿到的PropertySource,根据传入的key拿到我们在属性配置文件中配置的值,然后返回,到此,从属性文件中读取属性信息的过程结束。
流程一步一步往回返,回到BeanDefinitionVisitor类:
在这里插入图片描述
最后把从属性文件中获取到的值设置到pvs中,因为pvs是BeanDefinition的引用,因此,设置完成之后,beanDefinition也就被改变了

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

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

相关文章

C++信息学奥赛1122:计算鞍点

解题思路&#xff1a;这段代码的解题思路如下&#xff1a; 首先定义一个大小为5x5的二维数组arr来存储用户输入的矩阵元素。 使用两层嵌套循环&#xff0c;依次输入矩阵的每个元素。 接下来使用另外一个循环&#xff0c;遍历每一行。在每一行中&#xff0c;通过比较找到该行的…

编码器测速,获取实际速度

本例程中使用的电机为带霍尔编码器的减速电机&#xff0c;电机由三部分组成&#xff1a;减速器&#xff0c;电机以及霍尔编码器。 霍尔编码器工作原理&#xff1a;霍尔编码器通过电磁转换&#xff0c;将机械的位移转化为脉冲信号&#xff0c;并且输出A、B两相的方波信号&#x…

uniapp,使用canvas制作一个签名版

先看效果图 我把这个做成了页面&#xff0c;没有做成组件&#xff0c;因为之前我是配合uview-plus的popup弹出层使用的&#xff0c;这种组件好像是没有生命周期的&#xff0c;第一次打开弹出层可以正常写字&#xff0c;但是关闭之后再打开就不会显示绘制的线条了&#xff0c;还…

Docker(二) Docker容器

在docker中的容器都是由镜像所创建的&#xff0c;一个镜像可以创建多个容器。 一、调试Docker 启动Docker systemctl start docker 查看Docker中有哪些镜像 docker images 下载镜像 docker pull hello-world 运行镜像 docker run hello-world 出现 Hello from Docker! 这…

【方法】分卷压缩文件的密码忘记了怎么办?

压缩分卷压缩文件&#xff0c;和压缩成单个压缩文件一样&#xff0c;都是可以设置密码&#xff0c;保护文件不能被随意打开。 解压带有密码的分卷压缩文件&#xff0c;只需要解压第一个分卷文件&#xff0c;并输入原本设置的密码就可以解压全部分卷。但要是密码忘记了&#xf…

家装小程序制作丨家装行业必备媒介

在当今互联网时代&#xff0c;小程序已经成为许多企业和个人的首选&#xff0c;用于推广和销售产品或服务。对于家装行业来说&#xff0c;自有一款专属的家装小程序能够带来诸多好处。本文将探讨家装小程序制作的优点&#xff0c;并简要介绍相关的流程。 优点 提升用户体验&am…

Windows系统下安装Nginx以及相关端口问题的解决方法详解

系列文章目录 安装Tomac服务器——安装步骤以及易出现问题的解决方法 文章目录 系列文章目录 一 背景 二 安装 2.1 下载Nginx 2.2 选择Nginx版本 2.3 解压Nginx 三 Nginx的使用 3.1 Nginx基本目录 3.2查看80端口是否被占用 3.3 Nginx启动方式 第一种&#xff1a;双…

win10家庭版远程桌面补丁_rdp wrapper

RDP Wrapper Library 就是可以帮你在 Windows 7、Windows 8、Windows 10 家庭版中打开远程桌面的工具。 1、把电脑上打开的安全软件与杀毒软件都关掉&#xff0c;因为这个远程桌面补丁会修改系统文件&#xff0c;所以安全软件可能会拦截。 2、下载RDP Wrapper Library补丁压缩…

RISC-V(1)——RISC-V是什么,有什么用

目录 1. RISC-V是什么 2. RISC-V指令集 3. RISC-V特权架构 4. RiscV的寄存器描述 5. 指令 5.1 算数运算—add/sub/addi/mul/div/rem 5.2 逻辑运算—and/andi/or/ori/xor/xori 5.3 位移运算—sll/slli/srl/srli/sra/srai 5.4 数据传输—lb/lh/lw/lbu/lhu/lwu/sb/sh/sw …

MPLS与SD-WAN哪个更适合企业组网?

MPLS专线和SD-WAN是最为人熟知的两种组网方式&#xff0c;而且二者一个是传统组网方式&#xff0c;一个是新兴产品&#xff0c;所以难免会被放在一起比较。有人会问&#xff0c;MPLS专线和SD-WAN哪个更适合企业组网&#xff1f;其实&#xff0c;MPLS专线和SD-WAN都是企业实现高…

言语理解-中心理解之递进关系及转折关系

例题 例题 例题 记叙&#xff0c;议论多还是 例题 不仅仅依赖程度词&#xff0c;联系下文 例题 例题 例题 例题

​建材商城小程序制作:建材采购更便捷!

建材商城小程序主要用于建材产品的展示、销售和交易。用户可以在小程序中浏览各类建材产品&#xff0c;包括地板、瓷砖、卫浴、灯具等&#xff0c;并获取详细的产品信息、规格参数、价格以及用户评价等。 建材商城小程序优点&#xff1a; 便利的购物体验&#xff1a;建材商城小…

【洛谷】P1163 银行贷款

原题链接&#xff1a;https://www.luogu.com.cn/problem/P1163 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 这题需要注意的是利率按月累计这句话&#xff0c;也就是相当于“利滚利”。 我们定义sum变量表示贷款原值&#xff0c;money表示每月支付…

Java调用高德地图API根据详细地址获取经纬度

开发指南&#xff1a;地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图API 一、首先需要注册成为开发者&#xff0c;注册成功后就可以使用此开放平台。 高德开放平台网址&#xff1a;高德开放平台 | 高德地图API 点击注册&#xff1a; 选择注册方式&#xff0c;注册…

马斯克遭冷遇,Twitter更名近一个月,许多品牌仍未删除蓝鸟标志

根据报道&#xff0c;Twitter更名为X已经近一个月了&#xff0c;但许多主要品牌仍然没有完全删除其营销中的蓝鸟标志。只有宝洁这一家美国广告支出最高的公司在其网站的社交媒体联系信息中将蓝鸟换成了新的X标志。 另外&#xff0c;Expedia和IBM这两家公司在其网站上甚至没有显…

SSM整合-配置类版

目录 一、导入依赖二、SSM整合1.1 WebInit配置类1.2 SpringMvcConfig配置类1.3 SpringConfig配置类1.4 JdbcConfig配置类1.5 MybatisConfig配置类1.6 mybatis-config.xml配置1.7 log4j.xml配置1.8 目录结构 一、导入依赖 <properties><spring.version>5.3.1</sp…

mall :sa-token项目源码解析

文章目录 一、mall开源项目1.1 来源1.2 项目转移1.3 项目克隆 二、Sa-Toekn框架2.1 Sa-Token 简介2.2 分布式后端项目的使用流程2.3 分布式后端项目的使用场景 三、源码解析3.1 集成与配置3.1.1 导入依赖3.1.2 添加配置3.1.3 异常处理3.1.4 存储用户信息 3.2 登录认证3.2.1 配置…

智慧健康杂志智慧健康杂志社智慧健康编辑部2023年第15期目录

智慧医疗 医疗信息化 提高病案首页填写质量&#xff0c;体现病案信息利用价值 张明芳; 1-4 经支气管镜检查联合针吸活检术在肺癌诊断中的临床应用价值 邱洪亮; 5-8 高频超声对距腓前韧带损伤的诊断价值 梁劲松;叶绮婷;曹肖维; 9-12《智慧健康》投稿邮箱&#xff1a…

clickhouse(十四、分布式DDL阻塞及同步阻塞问题)

文章目录 一、分布式ddl 阻塞、超时现象验证方法解决方案 二、副本同步阻塞现象验证解决方案 一、分布式ddl 阻塞、超时 现象 在clickhouse 集群的操作中&#xff0c;如果同时执行一些重量级变更语句&#xff0c;往往会引起阻塞。 一般是由于节点堆积过多耗时的ddl。然后抛出…

第9章:聚类

聚类任务 性能度量 距离度量 非度量距离 原型聚类 有很好的统计学上的意义&#xff0c;但是只能找到椭球形的聚类。 密度聚类 层次聚类