我在默认tomcat-jdbc
设置中使用spring-boot
池。我希望每次在池中建立新的JDBC连接时以及第一次使用它之前运行一些自定义Java代码。怎么做,如果有几种可能性最好?
答案 0 :(得分:3)
要扩展已经接受的答案,如果您使用切入点,则可以使用Spring AOP 而不使用完整的AspectJ :
@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection())")
public void afterConnectionEstablished() {
...
}
答案 1 :(得分:2)
嗯,我可以想到两个选择:
创建自己的包装器类 - 通过扩展Tomcat的DataSource
类或实现Java的DataSource
接口并委派给包装的DataSource
- 然后添加您想要的逻辑通过手动实例化@Configuration
tomcat-jdbc
(有关如何执行此操作的示例,请参阅DataSourceConfiguration.Tomcat class)并将其包装到期望的方法并在DataSource
类中注册bean与你的班级。
创建一个方面并使用Spring的AOP支持来拦截对getConnection
的调用。由于DataSource
类在javax包中,我认为你必须使用AspectJ,而对于一些例子,请参考this link
我的建议是使用第一个选项,它应该会减少你的麻烦,这里有一个小例子来定义你的包装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
}