// DruidDataSource 类里的方法:获取连接
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
    init();

    // 责任链上的 filter 存在
    if (filters.size() > 0) {
        // 该类是执行整个责任链的执行者
        FilterChainImpl filterChain = new FilterChainImpl(this);
        // 每个需要执行责任链的方法,在 filterChain 里都可以找到映射方法,比如本方法 getConnection,就对应 filterChain.dataSource_connect(参考流程1.1)
        return filterChain.dataSource_connect(this, maxWaitMillis);
    } else {
        return getConnectionDirect(maxWaitMillis);
    }
}

// FilterChainImpl 类里的方法:获取连接映射方法
@Override
public DruidPooledConnection dataSource_connect(DruidDataSource dataSource, long maxWaitMillis) throws SQLException {
    // 除了 FilterChainImpl 里面包含一些 datasource 的映射方法,需要执行的 filter 里面也包括,比如下面的 dataSource_getConnection 方法
    if (this.pos < filterSize) {
        DruidPooledConnection conn = nextFilter().dataSource_getConnection(this, dataSource, maxWaitMillis);
        return conn;
    }

    // 执行到最后一个 filter 时,触发 datasource,返回真正的连接
    return dataSource.getConnectionDirect(maxWaitMillis);
}

// FilterChainImpl 类里的方法:获取下一个需要执行的 filter
private Filter nextFilter() {
    return getFilters()
            .get(pos++); // 根据游标计算
}

// 随便找了一个 filter 里的目标方法
// LogFilter 类里的方法:dataSource_getConnection
@Override
public DruidPooledConnection dataSource_getConnection(FilterChain chain, DruidDataSource dataSource,
                                                      long maxWaitMillis) throws SQLException {
    // 这里又会利用 FilterChainImpl 触发映射方法
    DruidPooledConnection conn = chain.dataSource_connect(dataSource, maxWaitMillis);

    // 下面就是自己内部的一些特有逻辑,忽略
    ConnectionProxy connection = (ConnectionProxy) conn.getConnectionHolder().getConnection();

    if (connectionConnectAfterLogEnable && isConnectionLogEnabled()) {
        connectionLog("{conn-" + connection.getId() + "} pool-connect");
    }

    // 返回
    return conn;
}