欢迎访问个人博客,同步更新: 枫山别院数据库
源代码版本2.4.5-SNAPSHOTthis
HikariConfig
有 3 个构造方法,这三个构造方法其实都差很少,无咱们逐个看一下:code
无参构造
第一个无参的构造,代码以下:get
public HikariConfig() { dataSourceProperties = new Properties(); healthCheckProperties = new Properties(); //① minIdle = -1; maxPoolSize = -1; maxLifetime = MAX_LIFETIME; connectionTimeout = CONNECTION_TIMEOUT; validationTimeout = VALIDATION_TIMEOUT; idleTimeout = IDLE_TIMEOUT; isAutoCommit = true; isInitializationFailFast = true; //② String systemProp = System.getProperty("hikaricp.configurationFile"); if (systemProp != null) { loadProperties(systemProp); } }
- ①初始化默认值
初始化默认值这部分,这些参数咱们在《HikariConfig的配置解析》一文中都解析过这些参数,略过不提。同步
- ②获取配置文件地址
在这里首先尝试获取key 是hikaricp.configurationFile
的配置文件地址,若是用户配置了,就会加载。咱们能够在启动应用的时候使用-D
指定。博客
咱们详细看下loadProperties
方法:string
protected void loadProperties(String propertyFileName) { //①将propertyFileName看成一个路径, 直接加载文件 final File propFile = new File(propertyFileName); //②判断propFile是一个文件, 就直接读取; 不是文件, 就继续查找, 加载不到, 直接报错 try (final InputStream is = propFile.isFile() ? new FileInputStream(propFile) : this.getClass().getResourceAsStream(propertyFileName)) { if (is != null) { Properties props = new Properties(); props.load(is); //③ PropertyElf.setTargetFromProperties(this, props); } else { throw new IllegalArgumentException("Cannot find property file: " + propertyFileName); } } catch (IOException io) { throw new RuntimeException("Failed to read property file", io); } }
- ①加载文件
尝试将propertyFileName看成一个路径, 直接加载文件it
- ②查找文件
在此判断propFile是否是一个文件, 是文件就直接读取; 不是文件, 就继续查找。若是最后仍是 加载不到, 直接直接报错。io
- ③获取属性
将Properties文件中的配置,取出来 set 到HikariConfig
中。ast
配置赋值
咱们看下实现:
public static void setTargetFromProperties(final Object target, final Properties properties) { if (target == null || properties == null) { return; } //①获取HikariConfig中的全部方法 List<Method> methods = Arrays.asList(target.getClass().getMethods()); //获取properties配置文件的全部配置项名称的集合, 例如dataSource.username = tom , 此处拿到的是dataSource.username这种等号左边的全部配置项 Enumeration<?> propertyNames = properties.propertyNames(); //遍历全部的配置项, 复制到HikariConfig中 while (propertyNames.hasMoreElements()) { Object key = propertyNames.nextElement(); String propName = key.toString(); //获取配置项对应的值 Object propValue = properties.getProperty(propName); if (propValue == null) { propValue = properties.get(key); } //②若是不是HikariConfig的配置, 是dataSource的配置, 也就是数据库相关的配置, 就添加到DataSourceProperty中 // 由于每一个数据库的配置可能不同, 全部没有 setter 方法 if (target instanceof HikariConfig && propName.startsWith("dataSource.")) { ((HikariConfig) target).addDataSourceProperty(propName.substring("dataSource.".length()), propValue); } else { //③若是不是 dataSource配置, 那就调用 setter 方法, 给HikariConfig赋值 setProperty(target, propName, propValue, methods); } } }
在①处,经过反射获取到HikariConfig
的全部方法,而后获取properties文件中因此的 key 值,遍历properties文件中的 全部key,将配置项一项一项的设置到HikariConfig
中。
注释很是详细,可是要提醒你们的是,并非全部的配置,HikariCP 都有对应的属性,有一些数据库独有的配置项,咱们一般是使用dataSource.XXX
来配置的,因此若是在properties文件中有以dataSource.
开头的配置项,那么就是dataSource的配置,要放到
DataSourceProperty中,这些配置没有对应的 setter。③处的setProperty
方法,就是一个比较普通的反射方式赋值的实现,你们看一下就能够了。