弹簧方面没有被getConnection

时间:2018-05-15 17:18:23

标签: spring aop aspectj spring-aop spring-aspects

我试图拦截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(..))

1 个答案:

答案 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。