DruidDataSource Filter使用
SPI过滤器初始化
init
方法进行SPI
的过滤器加载,通过阅读ServiceLoader
方法的API
,了解到需要在resources/META-INF/services/
,下创建名字为接口的全路径名称文件,内容为:实现类的全路径。
发现文件中并没有com.alibaba.druid.filter.Filter
,也就是这个方法根本不会加载。
private void initFromSPIServiceLoader() {
//跳过加载SPI过滤器
if (loadSpifilterSkip) {
return;
}
if (autoFilters == null) {
List<Filter> filters = new ArrayList<Filter>();
//加载SPI过滤器,com.alibaba.druid.filter.Filter
ServiceLoader<Filter> autoFilterLoader = ServiceLoader.load(Filter.class);
for (Filter filter : autoFilterLoader) {
//是否自动加载
AutoLoad autoLoad = filter.getClass().getAnnotation(AutoLoad.class);
//将过滤器放入filters
if (autoLoad != null && autoLoad.value()) {
filters.add(filter);
}
}
autoFilters = filters;
}
for (Filter filter : autoFilters) {
if (LOG.isInfoEnabled()) {
LOG.info("load filter from spi :" + filter.getClass().getName());
}
//添加过滤器
addFilter(filter);
}
}
加载过滤器 FilterManager.loadFilter
我们可以通过配置属性druid.filters
加载自定义过滤器,调用路径如下:
DruidDataSource.configFromPropety
加载properties
中的druid.filters
属性DruidDataSource.setFilters
DruidDataSource.addFilters
FilterManager.loadFilter
public static void loadFilter(List<Filter> filters, String filterName) throws SQLException {
//过滤器名称数量不能为0
if (filterName.length() == 0) {
return;
}
//判断是否是多个过滤器
String filterClassNames = getFilter(filterName);
if (filterClassNames != null) {
for (String filterClassName : filterClassNames.split(",")) {
//判断过滤器名称是否相符
if (existsFilter(filters, filterClassName)) {
continue;
}
//加载过滤器Class
Class<?> filterClass = Utils.loadClass(filterClassName);
if (filterClass == null) {
LOG.error("load filter error, filter not found : " + filterClassName);
continue;
}
Filter filter;
try {
//为过滤器进行实例化
filter = (Filter) filterClass.newInstance();
} catch (ClassCastException e) {
LOG.error("load filter error.", e);
continue;
} catch (InstantiationException e) {
throw new SQLException("load managed jdbc driver event listener error. " + filterName, e);
} catch (IllegalAccessException e) {
throw new SQLException("load managed jdbc driver event listener error. " + filterName, e);
} catch (RuntimeException e) {
throw new SQLException("load managed jdbc driver event listener error. " + filterName, e);
}
filters.add(filter);
}
return;
}
//filterClassNames不存在则走这下面加载过滤器
if (existsFilter(filters, filterName)) {
return;
}
Class<?> filterClass = Utils.loadClass(filterName);
if (filterClass == null) {
LOG.error("load filter error, filter not found : " + filterName);
return;
}
try {
//过滤器实例化
Filter filter = (Filter) filterClass.newInstance();
filters.add(filter);
} catch (Exception e) {
throw new SQLException("load managed jdbc driver event listener error. " + filterName, e);
}
}