我有一个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它不起作用。
有什么想法吗?
答案 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+.*(..))")