【问题标题】:Spring boot aop around Datasource.getConnection not work, somebody any idea?围绕 Datasource.getConnection 的 Spring boot aop 不起作用,有人知道吗?
【发布时间】:2017-01-02 22:48:29
【问题描述】:

旧的 spring XML 配置工作正常,我的 Aspect 调用每个人 getconnection Invoke:

<bean id="connectionInterceptor" class="mypackage.ConnectionAspect">
</bean>

<aop:config>
    <aop:aspect id="connectionLifecycleAspect" ref="connectionInterceptor">
        <aop:pointcut
            expression="execution(java.sql.Connection javax.sql.DataSource.getConnection(..)) "
            id="dataSourceGetConnection" />
        <aop:around method="aroundGetConnection" pointcut-ref="dataSourceGetConnection" />
    </aop:aspect>
</aop:config>

我的 java 类围绕获取连接

public class ConnectionAspect implements Serializable {

private final static Logger logger = Logger.getLogger(ConnectionAspect.class);

    public Connection aroundGetConnection(ProceedingJoinPoint joinPoint) throws Throwable {
        Connection connection = (Connection) joinPoint.proceed();
        setSessionUser(connection);
        return connection;
    }

Spring boot 不起作用,当我调用 get Connection 时没有调用任何方法。 但是 spring service aop demo 正在运行。

@Component
@Aspect
public class ConnectionAspect implements Serializable {

    @AfterReturning(pointcut = "execution(* javax.sql.DataSource.getConnection(..))", returning = "connection")
    public Connection setClientIdentifier(Connection connection)
            throws SQLException {
        System.out
                .println("-----------------------------------------------------------------------");
        return connection;


    }

    @Pointcut("execution(java.sql.Connection javax.sql.DataSource.getConnection(..))")
    public void aroundConnection() {
    }

    @Around("aroundConnection()")
    public Object aroundConnection2(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Completed: " + joinPoint);
        return joinPoint.proceed();
    }



    @Around("execution(java.sql.Connection javax.sql.DataSource.getConnection(..))")
    public Object aroundConnection3(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("Completed: " + joinPoint);
        return joinPoint.proceed();
    }
}

【问题讨论】:

  • (1) 这对我来说是不可理解的:“Spring boot 不起作用,当我调用 get Connection 时没有调用任何方法。”请解释:什么不起作用?哪个方法没有被调用?有任何错误信息吗? (2) 你有没有注意到这里有两个类名完全相同的类/方面?这可能是问题吗? (3) 应用程序是否从您的文件中提取了包含 AOP 配置的任何其他 XML 配置? (4) 如果您将aroundGetConnection(..) 更改为具有完全相同的签名(返回类型!)和内容,例如aroundConnection2()?

标签: spring spring-boot datasource spring-aop


【解决方案1】:

SpringBoot默认使用tomcat-jdbc作为DataSource实现。那么,下面的代码就可以正常工作了。

@AfterReturning(pointcut = "execution(* org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(..))", returning = "connection")
public Connection setClientIdentifier(Connection connection) throws SQLException {
    System.out.println("-----------------------");
    return connection;
}

【讨论】:

    猜你喜欢
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2014-02-27
    • 1970-01-01
    相关资源
    最近更新 更多