如何编写切入点来获取类方法的操作?

时间:2017-02-14 17:53:07

标签: spring hibernate aspectj

我有一个名为PersonDAOImpl的类,我使用Hibernate在我的数据库上保存数据。

为了审计类,我使用@Aspect注释创建了另一个类,在那里我声明了一些Pointcuts和Advices。每次我插入,更新或删除一个人时,我都能够在表上存储有关所执行操作的正确信息。

但是现在我有更多DAO课程,而且我不想为每个DAO上的每个方法创建更多Aspects类或更多建议。相反,我想"捕获"单个切入点中persist(),update()或delete()的操作。

例如我在DAO上有这个方法:

@Override
@Transactional
public void addPerson(Person p) {
    Session session = this.sessionFactory.getCurrentSession();
    session.persist(p);
    session.flush();
    logger.info("Person saved successfully, Person Details="+p);
}

这就是我审核插入的方式:

@Pointcut("execution(* com.dacasals.raspertwo.dao.PersonDAOImpl.addPerson(..))")
public void addNewPerson() {
}

@After("addNewPerson()")
public void aP() {
    System.out.println("added a new person");
    operation = "Insert";
    date = Calendar.getInstance().getTime();
    register(operation, date);
}

但是我想要@Pointcut(" execution(* com.dacasals.raspertwo.dao.anydaoclass.anymethod.persist(...))")

我的意思是在我的任何DAO类上调用persist()的任何方法的切入点。 update()和delete()也是一样的。

我怎样才能做到这一点?我已经尝试过'和'内码'但没有任何反应。提前谢谢。

2 个答案:

答案 0 :(得分:0)

您可能希望使用类似于此的内部表达式而不是执行表达式。

within(com.yourpackage..*)

为此,您必须确保所有DAO都在此包中。上面的表达式将匹配包com.yourpackage和classes子包中的类中定义的所有方法。

如果你想以其他方式配置它,这是一个简短的文档, Pointcut Expressions in Spring

答案 1 :(得分:0)

我会使用' AroundAdvice '。

引用文档:

  

周围的建议围绕匹配的方法执行运行。它有机会在方法执行之前和之后完成工作,并确定方法实际执行的时间,方式和方式。

Around Advice Spring documentation

因此,在您的示例中,您将拥有一个方法:

@Around("com.dacasals.raspertwo.dao.*.persist(..)")
public Object doSomething(ProceedingJoinPoint pjp) throws Throwable {

}

这样,每当“ com.dacasals.raspertwo.dao ”上的某个人调用persist方法时,Spring Aspect将调用 doSomething 方法。在方法执行之前和之后,周围的建议都有效,所以你应该注意不要做两次相同的事情。

我会为每个操作创建一个特定的方法(一个用于插入,另一个用于更新和删除)但您可以使用相同的方法使用短路操作符。这样,您的 @Around 注释就像:

@Around("com.dacasals.raspertwo.dao.*.persist(..) || com.dacasals.raspertwo.dao.*.update(..) || com.dacasals.raspertwo.dao.*.delete(..)")
public Object doSomething(ProceedingJoinPoint pjp) throws Throwable {

}