java - druid-spring-boot-starter中的一個疑問
曾经蜡笔没有小新
曾经蜡笔没有小新 2017-07-05 10:26:11
0
1
1238

先貼程式碼

@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);
        }
    }
}

不理解的地方在DruidDataSourceBuilder的maybeGetDriverClassName方法,顯然DruidDataSourceAutoConfigure中的方法dataSource在使用DruidDataSourceBuilder的時候,DruidDataSourceBuilder中的properties是沒有屬性的,這樣的話maybeGetDriverClassName方法不是沒有意義嗎?
還有一點是DruidDataSourceAutoConfigure的dataSource方法中的if判斷,在方法中dataSource應該還沒注入屬性吧,這樣判斷不是也沒意義?

曾经蜡笔没有小新
曾经蜡笔没有小新

全部回覆(1)
过去多啦不再A梦

可能是為以後 properties 裡面添加其他屬性留餘地吧。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板