Maison > Questions et réponses > le corps du texte
Publiez d'abord le code
@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);
}
}
}
Ce que je ne comprends pas, c'est la méthode MaybeGetDriverClassName de DruidDataSourceBuilder. Évidemment, lorsque la méthode dataSource dans DruidDataSourceAutoConfigure est utilisée dans DruidDataSourceBuilder, les propriétés de DruidDataSourceBuilder n'ont-elles pas de sens ?
Un autre point est le jugement if dans la méthode dataSource de DruidDataSourceAutoConfigure. Le dataSource ne devrait pas avoir d'attributs injectés dans la méthode. N'est-il pas inutile de juger ainsi ?
过去多啦不再A梦2017-07-05 10:28:11
C'est peut-être pour laisser la possibilité d'ajouter d'autres propriétés aux propriétés à l'avenir.