1

是否可以在方法结束时执行操作,换句话说,当函数控制使用注释返回给调用者(由于异常或正常返回)时?

例子:

@DoTaskAtMethodReturn
public void foo() {
.
.
. 
Method foo Tasks  
.
.
.

return;  -------->  Background task done by annotation hook here before returning to caller.
}
4

3 回答 3

1

您的问题被标记为Spring-Annotations,因此您显然正在使用 Spring。有几个步骤可以用 Spring 做你想做的事情:

在您的配置中启用 AspectJ/AOP 支持

<aop:aspectj-autoproxy/>

编写一个使用切入点的方面(参见Spring AOP vs AspectJ):@After@annotation

@Aspect
public class TaskDoer {

  @After("@annotation(doTaskAnnotation)")
  // or @AfterReturning or @AfterThrowing
  public void doSomething(DoTaskAtMethodReturn doTaskAnnotation) throws Throwable {
    // do what you want to do
    // if you want access to the source, then add a 
    // parameter ProceedingJoinPoint as the first parameter
  }
}

请注意以下限制:

  • 除非您启用 AspectJ 编译时编织或使用 javaagent 参数,否则必须通过 Spring 创建包含 foo 的对象,即您必须从应用程序上下文中检索它。
  • 如果没有其他依赖项,您只能将方面应用于通过接口声明的方法,即 foo() 必须是接口的一部分。如果您使用 cglib 作为依赖项,那么您还可以将方面应用于未通过接口公开的方法。
于 2013-02-11T21:45:38.070 回答
0

是的,但不仅仅是注释。

您必须编写自己的注释处理器并使用代码注入。

如何编写 Java 注释处理器?

什么是 Java 字节码注入?

Java字节码注入

于 2013-02-11T21:16:44.600 回答
0

简短的回答是“是的,有可能”。这是所谓的面向方面编程 (AOP) 的一部分。基于注解的 AOP 的一个常见用途是@Transactional,用于将所有数据库活动包装在一个事务中。

你如何处理这取决于你正在构建什么,你正在使用什么(如果有的话)框架等。如果你使用 Spring 进行依赖注入,这个SO answer有一个很好的例子,或者你可以查看Spring 文档. 另一种选择是使用 Guice(我的偏好),它允许简单的 AOP

于 2013-02-11T21:22:00.513 回答