我有一个名为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()也是一样的。
我怎样才能做到这一点?我已经尝试过'和'内码'但没有任何反应。提前谢谢。
答案 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 {
}