> 技术文档 > SpringBoot项目中常见注解

SpringBoot项目中常见注解


@RequiredArgsConstructor 注解
  • 类上添加该注解,Lombok 会自动生成一个构造函数,用于注入 final@NonNull 修饰的字段
@ConfigurationProperties注解
  • 用于将配置文件中的属性注入到某个类的字段上
sky: jwt: admin-secret-key: itcast admin-ttl: 7200000 admin-token-name: token
@ConfigurationProperties(prefix = \"sky.jwt\")public class JwtProperties { /** * 管理端员工生成jwt令牌相关配置 */ private String adminSecretKey; private long adminTtl; private String adminTokenName;}

注意:配置文件中使用横线而不是下划线 , 如果使用下划线(如 admin_secret_key), Spring Boot无法直接将其映射为 adminSecretKey,需要自定义映射规则.

@ConditionalOnMissingBean注解

用来防止重复注册: 当容器中已存在某个类型的Bean时,使用此注解可以避免再次注册相同类型的 Bean,防止Bean重复定义导致的异常。

示例:

@Configurationpublic class MyServiceConfig { @Bean @ConditionalOnMissingBean(MyService.class) public MyService defaultMyService() { return new DefaultMyServiceImpl(); }}

defaultMyService 方法仅在容器中不存在 MyService 类型的 Bean 时才会被调用,确保容器中只有一个MyService实例。

@RequestHeader注解

用于从请求头中获取指定的头部字段。直接绑定请求头中的某个参数到方法的参数上。

例如:

@RequestMapping(\"/header\")public String getHeader(@RequestHeader(\"User-Agent\") String userAgent) { return \"User-Agent: \" + userAgent;}

当发送请求时,User-Agent 头部的信息会映射到 userAgent 参数里。

@value注解

主要作用: 从配置文件中注入值

基本使用
  • 配置文件:
server: port: 8080
  • 注入:
@Value(\"${server.port}\")private String serverPort;
其他用法

如果 config.name 配置项 不存在,则使用 默认值:

@Value(\"${config.name:默认值}\")private String configName;

可以用逗号分隔方式读取数组:

config.names=张三,李四,王五
@Value(\"#{\'${config.names}\'.split(\',\')}\")private List<String> names;

🔹 这样 names 变量的值就是 [\"张三\", \"李四\", \"王五\"]

读取操作系统的环境变量 或 Java 系统属性:

@Value(\"${JAVA_HOME}\")private String javaHome;
@Pathvariable注解:
  • @pathvariable :用于指定路径参数,不带问号的,比如category/1这种形式.

  • 下面的url中,id直接以键值对形式跟在?后,明确地说明了这就是id的值,不用加@pathvariable注解.

http://localhost:8080/category?id=12345

如果路径参数和方法参数名一致,可以省略括号中的内容:

@PathVariable(\"id\") Long id
@RequestParam注解:

假设请求: http://localhost:8080/greet?name=John,则参数 name 会被赋值为 \"John\":

@GetMapping(\"/greet\")public String greet(@RequestParam String name) { return \"Hello, \" + name;}
@Service注解

该注解应该标注在 实现类上,而不是接口上。