使用支持灵活方法签名的Spring创建自定义注释

时间:2014-04-23 15:31:33

标签: java spring

在Spring MVC中,在Controller类中,使用@RequestMapping注释注释的方法允许Flexible Method Signature

如果我想用我自己的custom annotation做这样的事情,有人可以给我一些指示。

先谢谢。

1 个答案:

答案 0 :(得分:1)

Spring MVC在这方面有一些很多的功能,因此可能更容易将其他地方作为起点。 Spring 4中引入的新消息抽象具有类似的功能。

查看@MessageMapping,它允许您针对Message实例构建灵活的签名。例如,您可以注入消息的标题

public void foo(@Header("myHeader") int myHeader)

或者您可以针对Validator

验证有效负载
public void bar(@Payload @Validated Order order)

基础架构的核心位于InvocableHandlerMethod,它将根据传入的java.lang.reflect.Method和您可能提供的其他参数调用您在给定Bean实例上提供的Message (见public final Object invoke(Message<?> message, Object... providedArgs)

要创建该实例,您需要提供一组HandlerMethodArgumentResolver。每个HandlerMethodArgumentResolver负责处理方法参数。简而言之,这基本上将为您提供MethodParameter实例(即对您要处理的方法的参数的引用,例如上一个示例中带注释的order)并且您将要去告诉你是否支持它,当你这样做时,处理该参数以便注入正确的值。对于标头示例,实现将查找注释上具有名称的标头。简单!

例如在SimpAnnotationMethodMessageHandler中创建一组默认解析器(查看initArgumentResolvers)。这将向您展示默认情况下可以注入的参数类型。通过扩展该列表(或提供自定义实例),您可以扩充用户可以在方法签名中使用的内容。

在Spring 4.1中,我们依靠此基础结构来提供JMS侦听器带注释的端点,并且这些端点也可以具有灵活的签名。它是actually already implemented所以你可能想看看另一个例子。