未调用JdbcOperations中使用的Spring AOP Aspect

时间:2017-02-16 18:07:21

标签: java spring aspectj spring-aop spring-jdbc

我想做类似的事情http://www.gotoquiz.com/web-coding/programming/java-programming/log-sql-statements-with-parameter-values-filled-in-spring-jdbc/

我有一个Spring MVC项目,我使用的是Spring 4.3.0.RELEASE。

我为所有DAOS使用通用抽象类

public abstract class GenericDaoImpl {
    @Autowired
    protected JdbcTemplate jdbcTemplate;
}


@Repository
public class UserDAOImpl extends GenericDaoImpl implements UserDAO{

}

jdbcTemplate 在我的auto-config.xml

中定义
<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.user}" />
    <property name="password" value="${db.password}" />
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean>

为了在该指南中实现更接近的内容,我有

将这些依赖项添加到我的pom.xml:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>4.3.0.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.9</version>
</dependency>

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.9</version>
</dependency>

我已将 @EnableAspectJAutoProxy 添加到 @Configuration 类。

我的看点是:

@Aspect
@Component
public class SqlParametersLogger {

    private final Logger logger = LoggerFactory.getLogger(SqlParametersLogger.class);

    @Before("execution(* org.springframework.jdbc.core.JdbcOperations.*(..))")
    public void log(JoinPoint jp) {
        logger.info("Hello?");
    }
}

永远不会调用我的Aspect功能。我已经使用我的服务图层的切入点尝试了此Aspect,并且它可以正常工作。但是使用JdbcOperations它不起作用。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

您的aop表达式被定义为JdbcOperation的切入点。*这是一个接口,并且不建议接口调用。

AspectJ可以在spring框架中拦截spring-managed-beans的切入点。 如果bean不是spring管理的,你需要使用ProxyFactoryBean / ProxyFactory手动注册它以获取建议。在您的情况下,您已经有一个bean实现了在spring应用程序上下文中注册的JdbcOperations接口。

根据您的问题,更改切入点以使用JdbcOperations接口的任何实现(jdbcTemplate bean定义)应该可以解决您的问题。

例如

@Before("execution(* org.springframework.jdbc.core.JdbcOperations+.*(..))")