【问题标题】:How to add a custom annotation to Spring MVC?如何向 Spring MVC 添加自定义注解?
【发布时间】:2012-02-25 23:12:17
【问题描述】:

谁能解释我需要做些什么来实现我自己的注释,以便为我的网络请求添加功能?

例如:

@Controller
public class MyController {
    @RequestMapping("/abc")
    @RequiresSomeSpecialHandling
    public void handleSecureRequest() {
    }
}

这里的@RequiresSomeSpecialHandling 将是我自己的注释,它会导致在给定的网络请求/abc 之前或之后完成一些特殊工作。

我知道在非常高的层次上,我需要编写一个 bean 后处理器,扫描类以查找我的注释,并在需要时注入自定义 mvc 拦截器。但是有什么捷径可以简化这个任务吗?尤其是上面的两个例子。

提前致谢,

【问题讨论】:

  • 顺便说一句:如果“@RequiresAuth”只是一个例子,那很好,但不要重新发明spring security
  • 这只是一个示例 - 编辑了我的帖子以使示例更通用。

标签: spring spring-mvc spring-annotations


【解决方案1】:

这种注解(在调用方法时添加附加功能)看起来像触发 AOP 建议的注解。

@见春天Reference Chapter 7. Aspect Oriented Programming with Spring


想法是使用Annotation来触发AOP Advice。

喜欢:

@Pointcut("@target(com.example.RequiresAuth)")

【讨论】:

  • 谢谢。是的,AOP 在我的列表中,但我想尝试做一个注释并尽可能多地重用 MVC 工具。
  • @rustyx:是的,这就是背后的想法:使用 Annotation 触发 AOP Advice,请参阅我的扩展答案来说明它。
  • 我发现@annotation 在编写切入点表达式时很有用。
  • 我不要@Pointcut,我要@MyOwnAnnotation
  • @rustyx @Pointcut 是定义切入点的 aspectJ 语法(之一)
【解决方案2】:

取决于@RequiresSomeSpecialHandling 后您想要做什么。例如。您是否希望它影响请求映射或方法的调用(即解析方法参数、处理返回值)?

Spring 3.1 中对注释类的支持变得更加可定制。您可以在this repo 中浏览一些示例。

还要记住,Spring 3.1 中的 HandlerInterceptor 可以将处理程序对象强制转换为 HandlerMethod,这使您可以访问包括其注释在内的确切方法。对于您需要做的事情,这可能已经足够了。

【讨论】:

    【解决方案3】:

    如果缓存是您的目标之一,请查看自 Spring 3.1 起可用的 @Cacheable 注释(及其兄弟@CachePut@CacheEvict@Caching)。

    【讨论】:

    • 对不起,你的回答对我没用。我的示例中的 @NoCache 注释是关于 HTTP 无缓存,而不是方法缓存,无论如何它只是一个示例。
    猜你喜欢
    • 2011-06-13
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多