java - 当注释在类上时如何使注释在每个方法上都起作用,例如@ResponseBody
问题描述
我想写一个注释@ResponseBody
,在类上使用它,这样它就可以在每个方法上工作。所以我想知道如何实现。
解决方案
例如,类级别注释如何应用于所有方法,并不特定于@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 类型和类的第一个,然后将其用于实际转换。
推荐阅读
- c++ - 库未加载 libpng16.16.dylib 因为版本不兼容
- java - 如何解决任务':app:kaptDebugKotlin'的执行失败。对于 kapt "androidx.room:room-compiler:$version_room
- javascript - onClick 仅在按下两次时才有效
- python - 如何在 Selenium Python 中发送像 Command C 这样的键
- c# - c# where for generic type constraint class may not be
- r - R聚合向量列表到n个向量元素的唯一组合和总和相等组合
- postgresql - 在数组 postgres 中获取最大日期 json 对象
- javascript - 在 FreeMarker 上获取 URL 的 queryString 参数的更好方法
- typescript - 由于打字稿错误,无法将模型与反对中的额外属性相关联
- tensorflow - 有没有办法在 Tensorflow 中“反转”神经网络?