首页 > 解决方案 > 当注释在类上时如何使注释在每个方法上都起作用,例如@ResponseBody

问题描述

我想写一个注释@ResponseBody,在类上使用它,这样它就可以在每个方法上工作。所以我想知道如何实现。

标签: javaannotations

解决方案


例如,类级别注释如何应用于所有方法,并不特定于@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 的职责是将方法返回值转换为 HTTP 响应正文,具体取决于预定义的 mime 类型。

每次发出的请求遇到@ResponseBody注释时,spring 都会循环遍历所有已注册的 HttpMessageConverters,寻找适合给定 mime 类型和类的第一个,然后将其用于实际转换。


推荐阅读