如何在类上使用注解(例如@ResponseBody)时使其对每个方法起作用?

3

我想像 @ResponseBody 一样写一个注解,并将其用于类上,从而使它可以在每个方法上起作用。因此,我想知道如何实现。


1
请包含一份代码示例。 - achAmháin
为了实现这个,首先你需要一个注解处理器来读取注解本身,你有吗? - J-Alex
今天下午我想错了,现在我明白了。 处理器获取注释,我曾经认为Spring会做一些事情使类注释在方法上起作用。谢谢。 - sibo.wang
1个回答

3
一个类级别的注释适用于所有方法,不特定于@ResponseBody注释,它适用于所有这样的注释,例如@Transactional。当使用注释编译代码时,编译器运行相应的注释处理器(对特定注释感兴趣的注释处理器)。注释处理器通常使用反射来检查正在编译的元素。处理器可能只是在代码片段/方法上运行检查、修改它们或在最终编译之前生成新代码。这可能还包括修改该类的所有方法。可以参考http://mkyong.com/java/java-custom-annotations-example中实现类级别自定义注释的示例。
关于@ResponseBody: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ResponseBody.html指出,从spring 4.0版本开始,@ResponseBody注释也可以添加到类型级别,在这种情况下,它将被继承,不需要在方法级别上添加。
@ResponseBody如何工作:
如果你在一个方法(或封装类)上加上@ResponseBody注释,spring会尝试自动转换方法的返回值并将其写入http响应中。
根据你的配置,spring在后台注册了一系列HttpMessageConverters。HttpMessageConverter的职责是根据预定义的MIME类型,将方法返回值转换为HTTP响应主体。
每次发出请求命中@ResponseBody注释时,spring遍历所有已注册的HttpMessageConverters,寻找第一个适合给定mime类型和类的HttpMessageConverter,然后用它进行实际转换。

1
我的意思是当我在类上进行注释时,它可以在每个方法上起作用,我想知道 @ResponseBody 是如何实现的。 - sibo.wang
这是我的问题。 如何实现@ResponseBody? - sibo.wang
我明白你的意思,但是我想写一个像ResponseBody一样的注解,希望在类上标注时可以适用于每个方法,所以我想知道ResponseBody是如何实现的。 - sibo.wang
你可以在类级别上搜索自定义注释。请参考https://www.mkyong.com/java/java-custom-annotations-example/获取示例。如果我能回答您的问题,请接受它作为答案。 - gargkshitiz
说实话,这个答案并没有解决我的问题,但是我会给你一票。谢谢。 - sibo.wang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接