SpringBoot结合JDBC实现JdbcTemplate懒加载遇阻求助
问题分析与解决方案
核心问题
你的serbMsSqlJdbcTemplate Bean定义中,直接调用semArbDataSource(serbDetails)方法创建数据源实例,这种写法绕过了Spring的Bean生命周期管理机制。Spring无法为直接实例化的对象生成懒加载代理,导致@Lazy注解完全失效——启动时就会执行semArbDataSource和serbMsSqlJdbcTemplate方法,立即初始化Bean。
修复步骤
1. 修改JdbcTemplate的Bean定义,通过依赖注入获取DataSource
将serbMsSqlJdbcTemplate的参数改为注入semArbDataSource,而非直接调用方法:
@Lazy @RefreshScope @Bean public JdbcTemplate serbMsSqlJdbcTemplate(@Qualifier("semArbDataSource") DataSource semArbDataSource) { log.info("Hii 2"); return new JdbcTemplate(semArbDataSource); }
这样Spring会注入semArbDataSource的懒加载代理对象,只有当你第一次使用serbMsSqlJdbcTemplate时,才会触发数据源和JdbcTemplate的实际初始化。
2. 检查额外的初始化触发点
- 如果
StranDao被其他非懒加载的Bean依赖(比如启动时就加载的Service或Controller),即使JdbcTemplate是懒加载,也会提前触发初始化。可以给StranDao类添加@Lazy注解,或者梳理依赖链,确保没有启动时强制加载它的逻辑。 - 测试时可以暂时移除
@RefreshScope,先验证懒加载是否生效,确认后再重新添加——虽然Spring Boot 2.5.x中两者兼容,但某些场景下可能存在代理优先级冲突。
内容的提问来源于stack exchange,提问作者Image Literature
相关产品推荐
相关产品推荐

