Pos kod dulu
@Configuration
@ConditionalOnClass(com.alibaba.druid.pool.DruidDataSource.class)
@EnableConfigurationProperties(DruidStatProperties.class)
@Import({DruidSpringAopConfiguration.class,
DruidStatViewServletConfiguration.class,
DruidWebStatFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
@Bean
@ConfigurationProperties("spring.datasource.druid")
@ConditionalOnMissingBean
public DataSource dataSource(Environment env) {
DruidDataSource dataSource = DruidDataSourceBuilder.create().build();
//if not found prefix 'spring.datasource.druid' settings,'spring.datasource' prefix settings will be used.
if (dataSource.getUsername() == null) {
dataSource.setUsername(env.getProperty("spring.datasource.username"));
}
if (dataSource.getPassword() == null) {
dataSource.setPassword(env.getProperty("spring.datasource.password"));
}
if (dataSource.getUrl() == null) {
dataSource.setUrl(env.getProperty("spring.datasource.url"));
}
if (dataSource.getDriverClassName() == null) {
dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
}
// set filters default value on StatViewServlet enabled.
if (! "false".equals(env.getProperty("spring.datasource.druid.StatViewServlet.enabled"))) {
try {
dataSource.setFilters("stat");
} catch (SQLException e) {
e.printStackTrace();
}
}
return dataSource;
}
}
public class DruidDataSourceBuilder {
private Map<String, String> properties = new HashMap<String, String>();
public static DruidDataSourceBuilder create() {
return new DruidDataSourceBuilder();
}
public DruidDataSource build() {
DruidDataSource dataSource = new DruidDataSource();
maybeGetDriverClassName();
bind(dataSource);
return dataSource;
}
//use spring boot relaxed binding by reflection config druid . detail see Spring Boot Reference Relaxed binding section.
private void bind(DruidDataSource result) {
MutablePropertyValues properties = new MutablePropertyValues(this.properties);
new RelaxedDataBinder(result)
.withAlias("url", "jdbcUrl")
.withAlias("username", "user")
.bind(properties);
}
private void maybeGetDriverClassName() {
if (!this.properties.containsKey("driverClassName")
&& this.properties.containsKey("url")) {
String url = this.properties.get("url");
String driverClass = DatabaseDriver.fromJdbcUrl(url).getDriverClassName();
this.properties.put("driverClassName", driverClass);
}
}
}
Apa yang saya tidak faham ialah kaedah maybeGetDriverClassName dari DruidDataSourceBuilder Jelas sekali, apabila kaedah dataSource dalam DruidDataSourceAutoConfigure digunakan dalam DruidDataSourceBuilder, sifat dalam DruidDataSourceBuilder's tidak mempunyai atribut kes ini, mungkin DATASourceBuilder.
Maksud lain ialah penghakiman dalam kaedah dataSource DruidDataSourceAutoConfigure DataSource tidak sepatutnya mempunyai atribut yang disuntik dalam kaedah ini.
Mungkin ia memberi ruang untuk menambah hartanah lain pada hartanah pada masa hadapan.