# SSM 整合(Java 代码配置版)
# 1. 配置类
# 2. web.xml(及替代方案)
# 3. 配合 @PropertySource 使用的一个『坑』(了解、自学)
如果你想将数据库连接的相关属性移入一个 classpath 下的 .properties 文件中,让后再在上述配置类中结合 @PropertySource 和 @Value 来加载 .properties 配置文件,引入相关属性值,那么,你会发现一个问题,你的 @Value 读取到的属性值都是 null !
造成这个现象的原因在在于,我们是使用的 MapperScannerConfigurer 进行的『包扫描』的工作,而 MapperScannerConfigurer 开始『干活』的时机要比 @PropertySource 早!这就导致了,当你去读取标注了 @Value 的属性的值时,@PropertySource 还没有为它们赋值。
解决办法是:将 @Value 属性(甚至包括数据库的单例配置)拆分出去,再通过 @Import 引入回来,变相强迫 Spring 在 MapperScannerConfigurer 进行包扫描前先处理它们。
被拆分出去的 @Value :
@Data @Configuration @PropertySource("classpath:jdbc.properties") public class DataBaseProperties { @Value("${jdbc.driverClassName}") private String driverClassName; @Value("${jdbc.jdbcUrl}") private String jdbcUrl; @Value("${jdbc.username}") private String username; @Value("${jdbc.password}") private String password; }
再在 SpringDaoConfig 的配置中『引入』进来:
@Configuration @Import(DataBaseProperties.class) // 看这里,看这里,看这里 public class SpringDaoConfig { ... /* @Bean(initMethod = "init", destroyMethod = "close") public DruidDataSource dataSource(DataBaseProperties properties) { DruidDataSource ds = new DruidDataSource(); ds.setDriverClassName(properties.getDriverClassName()); ds.setUrl(properties.getJdbcUrl()); ds.setUsername(properties.getUsername()); ds.setPassword(properties.getPassword()); return ds; } */ @Bean(destroyMethod = "close") public HikariDataSource dataSource(DataBaseProperties properties) { HikariDataSource ds = new HikariDataSource(); ds.setDriverClassName(properties.getDriverClassName()); ds.setJdbcUrl(properties.getJdbcUrl()); ds.setUsername(properties.getUsername()); ds.setPassword(properties.getPassword()); return ds; } ... }