我试图拦截spring 3.2.3中的getConnection调用
@Component
@Aspect
@Order(value = 1)
public class ConnectionAspect {
//@AfterReturning(pointcut = "execution(java.sql.Connection javax.sql.DataSource.getConnection(..))", returning = "connection")
@Around("execution(java.sql.Connection javax.sql.DataSource.getConnection(..))")
public Connection prepare(ProceedingJoinPoint pjp) throws Throwable {
return MyConnectionProxy.newInstance((Connection) pjp.proceed(pjp.getArgs()));
}
}
调用getConnection时不会调用此方面。 点切割定义执行中是否有任何错误(java.sql.Connection javax.sql.DataSource.getConnection(..))
答案 0 :(得分:0)
Spring AOP只能建议spring托管bean。如果您的DataSource
实例不是Spring托管bean,那么您将无法通过Spring AOP实现目标。
我会尝试通过在容器提供的DataSource周围创建某种委托代理来解决这个问题,并使其成为由spring管理的bean。事实证明,它实际上是一个专门用于此目的的Spring课程。它被称为DelegatingDataSource
。您只需要对此类进行子类化,然后对getConnection()
方法(或您需要影响的其他方法行为)进行ovverride,将其设置为委派给提供的DataSource
容器,并将其设置为一个春天管理的豆,你很高兴。
在这个例子中应该这样做:
@Configuration
public class DataSourceConfiguration {
public static class MySpecialDataSource extends DelegatingDataSource {
public MySpecialDataSource(DataSource delegate) {
super(delegate);
}
@Override
public Connection getConnection() throws SQLException {
return super.getConnection();
}
}
@Bean
public DataSource dataSource(@Autowired DataSource containerDataSource) {
return new MySpecialDataSource(containerDataSource);
}
@Bean(name="containerDataSource")
public JndiObjectFactoryBean containerDataSource() {
JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean();
factoryBean.setJndiName("jdbc/MyDataSource");
return factoryBean;
}
}
最好的是你甚至不需要Spring AOP或AspectJ。