3

我在默认设置中使用tomcat-jdbc池。spring-boot每次在池中建立新的 JDBC 连接时以及第一次使用它之前,我都想运行一些自定义 Java 代码。怎么做,如果有几种可能性,哪一种是最好的?

4

2 回答 2

3

要扩展已经接受的答案,如果你使用切入点作为这个,你可以使用没有完整 AspectJ的 Spring AOP:

@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
    ...
}
于 2016-08-03T14:25:54.777 回答
2

好吧,我可以想到两个选择:

  1. 创建您自己的包装类 - 通过扩展 Tomcat 的DataSource类或通过实现 Java 的DataSource接口并委托给被包装的类DataSource- 然后将您想要的逻辑添加到所需的方法并@Configuration通过手动实例化您的类中注册一个 bean tomcat-jdbc DataSource(例如关于如何这样做,请参阅DataSourceConfiguration.Tomcat 类)并将其与您的类一起包装。

  2. 创建一个切面并使用 Spring 的 AOP 支持来拦截对getConnection. 由于DataSource类在 javax 包中,我认为您将不得不使用 AspectJ,有关一些示例,请参阅此链接

我的建议是使用第一个选项,它应该可以减少你的头疼,这里有一个小例子,你将如何定义你的 wrapper bean:

@Bean
public DataSource dataSource(DataSourceProperties properties) {
    return new MyDataSourceWrapper(tomcatDataSourceFrom(properties));
}

private org.apache.tomcat.jdbc.pool.DataSource tomcatDataSourceFrom(
    DataSourceProperties properties) {
    // manual instantiation like in DataSourceConfiguration.Tomcat class
}
于 2016-07-23T14:01:06.770 回答