前提 1.开启了byName自动注入
2.定义了PropertySourcesPlaceholderConfigurer
,去解析配置。
3.含有id="sqlSessionFactory"
的SqlSessionFactory
4.定义了MapperScannerConfigurer
,在其属性sqlSessionFactory
中的dataSource
属性中使用了${username}
、${password}
等。
原因
- MapperScannerConfigurer 是一个BeanDefinitionRegistryPostProcessor,它是
BeanFactoryPostProcessor
的实现类。
- 【Spring源码学习|MapperScannerConfigurer导致PlaceHolder的替换变量报错】PropertySourcesPlaceholderConfigurer是一个
BeanFactoryPostProcessor
的实现类。
- MapperScannerConfigurer 在 PropertySourcesPlaceholderConfigurer 之前被实例化。
3.1. 这是因为它们会在Spring的refresh
->invokeBeanFactoryPostProcessors(beanFactory)
被调用。 而顺序是 先注册BeanDefinitionFactoryProcessor
,再注册BeanFactoryPostProcessor
。
- MapperScannerConfigurer优先实例化的时候,开启了
default-autowire="byName"
会连同属性sqlSessionFactory一起初始化,并造成dataSource初始化, 那么${username}
被提前设置到dataSource中的username
属性中,但此时PropertySourcesPlaceholderConfigurer还未生成实例,更没有替换${username}
,导致错误!
4.1 开启default-autowire="byName"
自动注入后,会解析出需要"sqlSessionFactory"依赖,并提前初始化。
那么避免sqlSessionFactory的属性提前初始化。
1.去掉
default-autowire="byName"
2.改变sqlSessionFactory的id。(未验证) (TODO)
常见报错配置
参考
https://my.oschina.net/u/161336/blog/1830816
推荐阅读
- =======j2ee|spring用注解实现注入的@resource,@autowired,@inject区别
- jar|springboot项目打成jar包和war包,并部署(快速打包部署)
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...
- java人生|35K 入职华为Java开发那天,我哭了(这 5 个月做的一切都值了)
- Java毕业设计项目实战篇|Java项目:在线嘿嘿网盘系统设计和实现(java+Springboot+ssm+mysql+maven)
- 微服务|微服务系列:服务发现与注册-----Eureka(面试突击!你想了解的Eureka都在这里.持续更新中......)
- java|ApplicationListener和SpringApplicationRunListener的联系
- Spring|SpringSecurity--自定义登录页面、注销登录配置
- 性能|性能工具之 Jmeter 通过 SpringBoot 工程启动
- 代码狂魔|Spring源码分析之IOC容器初始化流程