这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战
昨天我们认识了下Druid,今天我们来玩玩它内置的扩展功能,就是它的拦截器,教学谈不上,就是一个简单的演示,不多说,我们直接开始吧。
工程还是昨天的工程,但我们又有了新的想法
搞代码
按照Druid的官方文档介绍,我们扩展它给定义好的类:FilterEventAdapter,然后找方法玩一玩,就你们两个吧:connection_connectBefore和connection_connectAfter,然后我们打个日志就好,当然你也可以扩展你想要的功能。
public class ConnectionLogFilter extends FilterEventAdapter {
@Override
public void connection_connectBefore(FilterChain chain, Properties info) {
DataSourceProxy dataSource = chain.getDataSource();
log.info("con-bef"+dataSource.toString());
}
@Override
public void connection_connectAfter(ConnectionProxy connection) {
DataSourceProxy dataSource = connection.getDirectDataSource();
log.info("con-aft"+dataSource.toString());
}
}
代码搞完了,确实,但是为什么能生效,你不得去看一眼嘛?看看这两个方法都干什么了?
过于先进,不予展示,好吧,就是专门做扩展的,看看什么时候调用
然后,我们看到了这个玩法,明白了:获取连接前后加一个获取连接,这不就是典型的动态代理式写入字节码嘛?哈哈,对,其实差不多。
获取连接之前后,你想校验,你想干什么都可以,我对连接没啥兴趣,就先打印吧。
搞配置
扩展完之后,你得告诉Druid,小得啊,我扩展个过滤器,你给我加载吧,通过什么方式呢?配置文件,小得,肯定听不懂你那鸟语啊。
于是我就高高兴兴的按照操作说明书配了一下,🆗,启动。
spring.datasource.druid.filter-class-names=geektime.spring.data.druiddemo.filter.ConnectionLogFilter
看到一朵蘑菇云呐,没成功,怎么的了呢?
警告:错误创建Bean,因为这个Bean有个字段是DataSource,在绑定配置的时候失败了。
失败是失败了,那原因呢?不然我这几十行代码不是打水漂了嘛?
原因分析
原因是什么呢?啊,.filter-class-names没有Set方法,那Spring给的解决方案是什么呢?无它,你给我更新你的配置。
那我们就点进去看下,是不是没有Set方法:
还真没有,想想也是这是人家给提供的方法,没写你的属性,就是说你想把你的标准定义到人家的文件上,用这个方法是行不通的,那我们得看看还有没有别的方法。
修改你的配置
我在druid的配置上看到,它是这么玩的,于是乎,ctrl+c,v.
那我就按照你的标准来。
druid.filters.conn=geektime.spring.data.druiddemo.filter.ConnectionLogFilter
成功创建了连接,并打了日志,事情到这应该结束了,读者都想吐了。
但问题是我明明初始化了5个连接,怎么就打印一个数据源呢?
继续修改
于是,我想到了你只是告诉Druid了啊,SpringBoot它不知道啊: 继续修改
spring.datasource.druid.filters=conn,config,stat,slf4j
打印了10次数据源,该结束了,拜拜。