我在使用切入点表达式建议方法时遇到了问题。 我有以下配置:
Spring 3.1.2.RELEASE
的pom.xml
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.2</version>
</dependency>
servlet.xml中
<aop:aspectj-autoproxy/>
我想要建议的课程
@Repository(value="userDaoImpl")
@Transactional
public class UserDaoImpl implements UserDao{
//attributes and methods
@Override
public void delete(ProfiledUser user) throws HibernateException
{
sessionFactory.getCurrentSession().delete(user);
}
}
它实现了 UserDao
接口,扩展了 GenericDao<T>
接口
这是我的建议
@Aspect
@Component("userDeletionAspect")
public class UserDeletionAspect {
@Pointcut("execution(public void aa.bb.cc.dd.UserDaoImpl.delete(..))")
public void objectDeletionPointcut(){}
@Before("objectDeletionPointcut()")
public void notifyDeletion(JoinPoint jp)
{
System.out.println("pointcut executed");
}
}
哪个不起作用。这意味着当执行UserDaoImpl的delete方法时,它根本不会被截获。
从Spring Documentation我读到spring代理使用Interfaces 工作所以我试着改变Pointcut定义如下:
@Pointcut("execution(* aa.bb.cc.dd.GenericDao.delete(..))")
但没有任何改变。
如何拦截.delete()
类的UserDaoImpl
方法?
答案 0 :(得分:1)
你需要
<aop:aspectj-autoproxy>
<aop:include name="userDeletionAspect"/>
</aop:aspectj-autoproxy>
而不是
<aop:aspectj-autoproxy/>
仅供参考 - 您可以在切入点表达式中定位具体类或特定接口的实现。
Spring只能定位公共方法,因此您可以从切入点表达式中删除“公共”部分。另外,如果你想要,你可以像切线表达式一样声明你的建议:
@Before("execution(void aa.bb.cc.dd.UserDaoImpl.delete(..))")
public void notifyDeletion(JoinPoint jp) {
System.out.println("pointcut executed");
}
你现在应该很高兴,但是如果你还有一些问题,这里有一个使用Spring AOP的简单日志示例 - logging with AOP in spring?