Maison  >  Questions et réponses  >  le corps du texte

java - Une question dans Druid-spring-boot-starter

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 ?

曾经蜡笔没有小新曾经蜡笔没有小新2662 Il y a quelques jours1172

répondre à tous(1)je répondrai

  • 过去多啦不再A梦

    过去多啦不再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.

    répondre
    0
  • Annulerrépondre