<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg>
讯享网
最近在项目中使用Druid时,从SpringBoot 1.5.11升级到2.2.13后,通过监控发现连接池属性为默认值,自定义属性值未生效,今天一起探究下Druid连接池自动装配过程。
我们在项目中对于系统配置参数一般采用 “动静分离” 模式:
- 静态参数:即启动配置文件application.yml中配置的是静态参数,一般不随环境【Dev、Test、Prod】而发生改变
- 动态参数:该类参数随部署运行环境而变化,一般采用额外properties文件进行配置,SpringBoot应用启动时,进行加载、解析、存入Envionment中。
讯享网
讯享网
以上代码在SpringBoot 1.5.11版本运行正常,在SpringBoot2.2.13版本中连接池属性未生效。
可以发现:
- ① 继承于,且实现了接口
- ② 使用了注解
DruidDataSource属性来源于四部分:
- System.getPropertis();
- DruidDataSourceConfig配置类druidDataSource();
- 基于注解的DruidDataSourceWrapper属性注入;
- InitializingBean的afterPropertiesSet()方法,使用了DataSourceProperties配置类
DataSourceProperties源码:
讯享网

讯享网
参见:
- spring Bean的初始化过程解析
- Spring源码:Bean 的实例化及初始化过程?
SpringBean初始化源码:
BeanPostProcessor的处理方法:
在Bean初始化前,调用所有的方法,在中会进行的注册,即,而中有2个重要的方法:
讯享网
基于注解的属性注入类实际就发生在SpringBean初始化过程中,调用的是的前置处理方法,是一个,它通常被框架添加到容器,用于解析bean组件上的注解,将属性源中的属性设置到bean组件。
该方法的实现如下 (SpringBoot 2.2.13):

上面的方法主要做两件事情 :
4.1 获取bean注解@ConfigurationProperties属性
我们点开ConfigurationPropertiesBean.get(this.applicationContext, bean, beanName),发现这样一个方法:
讯享网
我们不难看出是用来返回一个,也就是我们定义的配置类的Bean,既可以是直接注解在配置类本身的也可以是注解在@Bean方法上的(其实就是上文提到的@ConfigurationProperties的两种用法)。当然它也可以返回一个null,如果它没用@ConfigurationProperties注解。
4.2 执行配置属性绑定
从以上分析可以看出,ConfigurationPropertiesBindingPostProcessor主要负责以下任务 :
- 准备配置属性绑定工具;
- 过滤容器中每个带有注解的bean组件,使用配置属性绑定工具对它们进行配置属性绑定。
注意 : 配置属性的绑定细节由ConfigurationPropertiesBinder负责,而不是由ConfigurationPropertiesBindingPostProcessor负责。
1.5.11版本源码:
讯享网
基于以上代码分析,发现:
这就可以得出以下结论:
- 在SpringBoot 2.2.13版本中,由于不再扫描BeanClass上的注解,所以导致注解未注入连接池,导致连接池的属性为默认值;
- 配置类的注解仍然有效
- InitializingBean的afterPropertiesSet()方法中使用DataSourceProperties的几个属性也同样有效
① 修改配置类
② 修改配置文件

讯享网
配置文件可以删除了。
① 修改配置文件
① 修改配置类
讯享网
② 修改配置文件
配置文件可以删除了。
① 可以添加进VM参数中,比如
② 可以通过代码设置属性值
属性列表如下:
讯享网
详情请查看方法
比较简单,不再赘述。
① 底层开源框架升级时,需明确当前版本到目标版本的差异点,并逐项分析对当前项目的影响;
② 当升级到新版本时,有些属性、配置等可能已经被重命名或删除了,通过添加依赖,能在工程启动过程中,在控制台打印出一些环境配置相关信息,来帮助我们做升级适配。切记修复完升级后的各种问题,记得将依赖项从工程中删除;
③ 公共基础设施依赖,比如Redis、ES等,建议进行二次封装,将第三方库的影响封装在技术组件内部,由统一技术组进行维护适配,降低对应用的影响;
④ 自动化测试的重要性,依赖于人工分析排查仅能解决一部分问题,如果项目中有完备的自动化测试用例,那么框架升级会省时又省心;
⑤ 无论是版本升级,还是其它故障导致的BUG,我们在了解源码的基础上,只需耐心且细心的去DEBUG,就能解决百分之八十的问题,而且对个人而言,也是从“cv程序员”往资深程序员的一种能力成长,不要害怕问题,要敢于直面问题。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/186931.html