java注解
提示:本文大部分翻译采用APP直接翻译
文章目录
- java注解
- 一、java的内置注解(java 7 后额外添加了后三个注解)
- 二、[元注解](https://baike.baidu.com/item/%E6%B3%A8%E8%A7%A3/22344968)
- 三、常用注解
- @`Controller`
- @`RequestMapping`
- @`PatchMapping`
- @`GetMapping`
- @`PostMapping`
- @`PutMapping`
- @`DeleteMapping`
- @`RestController`
- @`ResponseBody`
- @`RequestBody`
- @`RequestParam`
- @`PathVariable`(路径变量)
- @`PathParam`()
- @`ResponseStatus`
- @`QueryParam`
- @`ExceptionHandler`
- @`ControllerAdvice`
- @`Data`
- @`AllArgsConstructor`
- @`NoArgsConstructor`
- @`RequiredArgsConstructor`
- @`Component`
- @`Service`
- @`Slf4j`
- `@Accessors(chain = true)`
- 四、spring的常用注释
- 五、小
- 六、其他包
一、java的内置注解(java 7 后额外添加了后三个注解)
-
@
Override
-重写方法 -
@
Deprecatd
过时方法使用会编译警告https://baike.baidu.com/item/%E6%B3%A8%E8%A7%A3/22344968 -
@
SuppessWarnings
忽略声明警告 -
@
Target
--标记注解为哪个java成员 -
@
Inherited
标记注解继承哪个注解 -
@
SafeVarargs
忽略任何参数关于 泛型变量的方法和构造函数产生的警告 -
@
FunctionalInterface
标识一个匿名函数或函数式接口 -
@
Repeatable
标识某注解可以在同一个声明上使用多次。
二、元注解
- @
Retention
描述注解保留的时间范围
package java.lang.annotation;
/**
* Annotation retention policy. The constants of this enumerated type
* describe the various policies for retaining annotations. They are used
* in conjunction with the {@link Retention} meta-annotation type to specify
* how long annotations are to be retained.
*
* @author Joshua Bloch
* @since 1.5
*/
public enum RetentionPolicy {
/**
* Annotations are to be discarded by the compiler.
* 注释将被编译器丢弃
* 源文件保留
*/
SOURCE,
/**
* Annotations are to be recorded in the class file by the compiler
* but need not be retained by the VM at run time. This is the default
* behavior.
* 在编译器 保留 不在运行虚拟机时保留
*/
CLASS,
/**
* Annotations are to be recorded in the class file by the compiler and
* retained by the VM at run time, so they may be read reflectively.
*注释将被编译器记录在类文件中由VM在运行时保留,因此它们可能被反射地读取。
运行期保留 可以通过反射获得注解信息
* @see java.lang.reflect.AnnotatedElement
*/
RUNTIME
}
- @Target
描述注解的使用范围(即:被修饰的注解可以用在什么地方) 。
public enum ElementType {
/** Class, interface (including annotation type), or enum declaration 类,接口,枚举类 */
TYPE,
/** Field declaration (includes enum constants) 成员变量 枚举常量*/
FIELD,
/** Method declaration 成员方法 */
METHOD,
/** Formal parameter declaration 方法参数*/
PARAMETER,
/** Constructor declaration 构造方法*/
CONSTRUCTOR,
/** Local variable declaration 局部变量*/
LOCAL_VARIABLE,
/** Annotation type declaration 注解类*/
ANNOTATION_TYPE,
/** Package declaration 修饰包*/
PACKAGE,
/**
* Type parameter declaration
*类型 参数 1,。8 新增
* @since 1.8
*/
TYPE_PARAMETER,
/**
* Use of a type
*使用类型的任意地方
* @since 1.8
*/
TYPE_USE
}
- @
Documented
机反(记录注释)
是一个标记注解 功能生成帮助文档时保留其注解信息
默认情况下,JavaDoc 是不包括注解的,但如果声明注解时指定了 @Documented,就会被 JavaDoc 之类的工具处理,所以注解类型信息就会被包括在生成的帮助文档中。
- @
Inherited
机反(遗传)
标记注解 用来指定该注解可以被继承
- @
Result
三、常用注解
@Controller
//控制器 @component扩展 用于指示Spring类的实例是一个控制器,该注解不需要在实现COntroller接口
//只需要加入控制器类上 ,spring扫描机制加会找到这个类 <context:component-scan base-package=“com”/>
//需要在xml中 添加 包扫描配置信息
@RequestMapping
//用于映射一个请求或者一个方法,可以放在方法或者类上面
//在类上 : 该类中的所有方法到将映射为相对于类级别的请求,表示该控制器所有请求映射到value属性值所指定的路劲下 /user/selectUser
//在方法上 : 作为请求处理方法在程序接受到对应的url请求时调用
一些组合注解
@PatchMapping
@GetMapping
@PostMapping
@PutMapping
等于= @RequestMapping(value = “/updatePerson”,method =
RequestMethod.PUT) 就相对于这个了 这几个 都是相同类似的 注解
@DeleteMapping
@RestController
相当于@ResponseBody和@Controller的组合注解
原来返回json需要@ResponseBody和@Controller配合。
@ResponseBody
将java对象转为json格式的数据,使用此注解之后不会再走视图处理器 , 可以把后台传到前端的数据自动转换为json
@RequestBody
用来接收前端传递给后台的json字符串 一般是post请求
一个请求,只有一个RequestBody
看大佬的去
注意
使用requestBody时不能使用getMapping请求 因为 不支持request body 中放值
推荐文章
@RequestParam
作用 :传递参数
在接收前端传递的参数时,参数的名字必须有对应的名字 如果没有对应的名字会报400
一个请求,可以有多个RequestParam。
方法中的参数
value:参数名字,即入参的请求参数名字,如username表示请求的参数区中的名字为username的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报404错误码;
也可以直接接MAP
@PathVariable
(路径变量)
以将 URL 中占位符参数绑定到控制器处理方法的入参中
@PathParam
()
这个注解是和spring的pathVariable是一样的,也是基于模板的,但是这个是jboss包下面的一个实现,上面的是spring的一个实现,都要导包
@ResponseStatus
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
该函数用于设置响应状态码为500(内部服务器错误)。 当服务器在处理请求时发生不可预知的错误时,可以使用该注解将响应状态码设置为500,告知客户端发生了内部服务器错误。
@ExceptionHandler(Exception.class)
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
public ResultDTO<String> handleException(Exception e) {
log.error("系统异常", e);
ResultDTO<String> resultDTO = new ResultDTO<>();
resultDTO.setMessage(e.getMessage());
resultDTO.setSuccess(Boolean.FALSE);
resultDTO.setCode(String.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value()));
return resultDTO;
}
用应返回的状态代码和原因标记方法或异常类。
当调用处理程序方法时,状态代码将应用于HTTP响应,但不会覆盖通过其他方式设置的状态信息,如ResponseEntity或“redirect:”。
警告:在异常类上使用此注释时,或设置此注释的原因属性时,将使用HttpServletResponse.sendError方法。
对于HttpServletResponse.sendError,响应被认为是完整的,不应再写入任何内容。此外,Servlet容器通常会编写一个HTML错误页面,因此使用了不适合RESTAPI的原因。对于这种情况,最好使用org.springframework.http。ResponseEntity作为返回类型,并完全避免使用@ResponseStatus。
请注意,控制器类也可以用@ResponseStatus进行注释,然后由tha中的所有@RequestMapping和@ExceptionHandler方法继承
@QueryParam
是jax-rs提供的 和 spring RequestParam的功能是一样的
@ExceptionHandler
作用 : 自定义注解
有什么用 :可以当成异常拦截器
用在方法上 结合ControllerAdvice注解 可以进行全局异常拦截处理
@ControllerAdvice
这是一个增强的 Controller
用来
全局异常处理
全局数据绑定
全局数据预处理
@Data
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
注解在类上, 为类提供get,set读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
@AllArgsConstructor
翻译:所有构造函数
会生成一个包含所有变量,同时如果变量使用了NotNull annotation , 会进行是否为空的校验,
使用后添加一个构造函数,该构造函数含有所有已声明字段属性参数就是全部参数的构造函数的自动生成,该注解的作用域也是只有在实体类上,参数的顺序与属性定义的顺序一致。
@NoArgsConstructor
翻译: 无参数构造函数
无参构造函数
@RequiredArgsConstructor
Spring 从 4.0 开始, 就不在 推 荐 使 用 属 性 注 入 ,原因是它会让我们忽略掉一些代码的隐患。
所以,构造器的方法就成了首选。
可以生成带有必需参数的构造函数
把需要注入的属性,修改成 final 类型的(或者使用 @NotNull 注解,不推荐),这些属性将构成默认的构造器。
基于lombok包,必须引用lombok
@Component
最普通的组件,可以被注入到spring容器进行管理
把普通pojo实例化到spring容器中,相当于配置文件中的
@Service
作用于业务逻辑层
把服务层的类交给springioc容器管理
@Slf4j
pom文件加入lombok的依赖
作日志输出的,
@Accessors(chain = true)
@Accessors(chain = true)是Lombok库中的一个注解,用于自动生成具有链式调用特性的getter和setter方法。当您在类定义上添加此注解时,Lombok会为该类的属性生成setter方法,使得调用setter方法后返回当前对象实例,而不是传统的void。这样,可以方便地连续调用多个setter方法,形成链式调用,提高代码的可读性和简洁性。
注意子父类继承的时候可能导致方法返回类型不同 报错
- 链式setter与覆盖冲突:
如果BaseEntity类没有使用@Accessors(chain = true)注解,其setDelFlag方法遵循传统JavaBean规范,返回void。而父类或子类使用了@Accessors(chain = true)注解,导致其生成的setDelFlag方法返回当前对象实例(即父类或子类的实例)。
在这种情况下,子类的setDelFlag方法与父类的setDelFlag方法返回类型不兼容,无法构成有效的覆盖关系。编译器会报出类似“返回类型不兼容”的错误。 - IDE或编译器对Lombok注解的支持问题:
虽然Lombok注解在编译阶段会被处理并生成对应的Java代码,但IDE或编译器在解析和显示错误时可能无法正确识别和处理这些注解。
这可能导致IDE或编译器错误地报告返回类型不兼容,即使实际上子类的setDelFlag方法已经正确实现了链式调用,并且返回类型与父类方法一致(即都是当前类的实例)。
四、spring的常用注释
@SpringBootApplication
(Spring Boot 应用程序)
有了它项目就可以运行起来,因为他相当于3个注解的功能
@SpringBootConfiguration
(Spring Boot 配置)
加载Spring的配置
@EnableAutoConfiguration
(启用自动配置)
@ComponentScan
(组件扫描)
@Configuration
(配置)
等同于spring的XML配置文件(将类标记为应用程序上下文的Bean定义的源。)
@Import
- List item
@Import引入普通的类可以帮助我们把普通的类定义为Bean。@Import可以添加在@SpringBootApplication(启动类)、@Configuration(配置类)、@Component(组件类)对应的类上。
@Secured
和@PreAuthorize
@Autowired
翻译 : 自动连线
如果容器中存在一个bean,这个bean的类型和id与被标注@Autowired的属性或者方法参数的类型和名称相同, 就可以完成依赖注入 主要用到的功能就是依赖注入了
推荐文章
@Resource
翻译:资源
spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
类似Autowired Autowired默认按种类自动找 resource 默认按面字
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
看的这个兄弟的
@RefreshScope
@Transactional
事务处理
@Transactional(rollbackFor = {Exception.class, RuntimeException.class})
@Serial
- 标注常量
- 标注序列化方法
- 标注 readResolve 和 writeReplace 方法
serialVersionUID: 类实现了Serializable 接口时,serialVersionUID 用作版本控制。
@Serial 注解可以被用来明确标记这个字段,表明它与序列化直接相关。
@Serial
private static final long serialVersionUID = 1L;
使用 @Serial 注解不是强制性的,
但它可以帮助开发人员和工具更好地理解代码,特别是在涉及序列化操作时。通过标注直接参与序列化过程的相关字段和方法,可以更明确地展示代码的意图,同时也利于静态分析工具检查代码的正确性。
@Cacheable
添加缓存
@CacheEvict
清楚缓存
@CachePut
更新缓存
@Caching
针对一个方法或者数据创建多个缓存
@CacheConfig
类级别注释
可以共享缓存名称
++++++++++++++++++++++++++++++++++Spring缓存官方参考地址
五、小
@FieldEncrypt
mybatis- plus-mate
付费使用面向企业的版本,里面提供了企业常规需要的一些东西,这个注解就是里面提供的加密功能的注解,可以写在字段上,也有脱敏相关的内容
@Trim
@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Trim {
}
和trim方法差不多
六、其他包
JUnit5和Junit 4
JUnit5 @BeforeAll 注解替换了 JUnit4 中的@BeforeClass注解。 它用于表示应在当前测试类中的所有测试之前执行注解方法。
swagger
@Operation(v3)
接口注释
@Operation(summary = " ", description = " ")