Spring Boot 最常用注解top100

大家好,我是晓凡。

以下是 熬夜整理的Spring Boot 中最常用的 100 个注解(按功能分类整理),适用于配置、控制层、数据访问、安全、测试等常见场景:


🧱 一、核心注解(Core Annotations)

  1. @SpringBootApplication:标记主类,启用自动配置和组件扫描。
  2. @Component:通用组件,自动扫描注入 Spring 容器。
  3. @Service:业务逻辑层组件。
  4. @Repository:数据访问层组件,自动处理异常。
  5. @Configuration:声明配置类,替代 XML 配置。
  6. @Bean:在配置类中定义一个 Bean。
  7. @ComponentScan:指定 Spring 要扫描的包路径。
  8. @PropertySource:加载外部属性文件。
  9. @Value:注入属性值。
  10. @Autowired:自动装配 Bean。
  11. @Qualifier:配合 @Autowired 解决多个同类型 Bean 冲突。
  12. @Primary:标记首选 Bean。
  13. @Scope:定义 Bean 的作用域(如 prototype、singleton)。
  14. @Lazy:延迟初始化 Bean。
  15. @Profile:根据环境激活配置。

🌐 二、Web 相关(Web & REST)

  1. @RestController:组合 @Controller + @ResponseBody
  2. @Controller:定义控制器类,返回视图名称。
  3. @RequestMapping:映射请求 URL 到类或方法。
  4. @GetMapping:映射 GET 请求。
  5. @PostMapping:映射 POST 请求。
  6. @PutMapping:映射 PUT 请求。
  7. @DeleteMapping:映射 DELETE 请求。
  8. @PatchMapping:映射 PATCH 请求。
  9. @PathVariable:获取 URL 中的变量。
  10. @RequestParam:绑定请求参数。
  11. @RequestBody:将请求体转为对象。
  12. @ResponseBody:将返回值直接写入 HTTP 响应体。
  13. @RequestHeader:获取请求头信息。
  14. @CookieValue:获取 Cookie 值。
  15. @SessionAttribute:从会话中获取属性。
  16. @CrossOrigin:允许跨域请求。
  17. @ResponseStatus:设置响应状态码。
  18. @ExceptionHandler:处理控制器内异常。
  19. @ControllerAdvice:全局异常处理器。
  20. @RestControllerAdvice:结合 @ControllerAdvice@ResponseBody
  21. @Valid:触发对 Bean 的校验。
  22. @InitBinder:用于自定义数据绑定与验证规则。

💾 三、数据访问(Data Access / JPA / MyBatis)

  1. @Entity:JPA 实体类。
  2. @Table:指定实体对应的数据库表名。
  3. @Id:标识主键字段。
  4. @GeneratedValue:主键自动生成策略。
  5. @Column:映射字段到数据库列。
  6. @Transient:忽略该字段持久化。
  7. @OneToOne:一对一关联。
  8. @OneToMany:一对多关联。
  9. @ManyToOne:多对一关联。
  10. @ManyToMany:多对多关联。
  11. @JoinColumn:指定外键字段。
  12. @JoinTable:多对多关系中的连接表。
  13. @Query:自定义 JPQL 或原生 SQL 查询。
  14. @Modifying:执行更新操作。
  15. @Transactional:声明事务边界。
  16. @EnableJpaRepositories:启用 JPA Repository 扫描。
  17. @RepositoryRestResource:暴露 Repository 为 REST 接口。
  18. @Select:MyBatis 查询注解。
  19. @Insert:MyBatis 插入注解。
  20. @Update:MyBatis 更新注解。
  21. @Delete:MyBatis 删除注解。
  22. @Options:MyBatis 操作选项,如生成主键。
  23. @Results:结果映射。
  24. @ResultMap:引用已有的结果映射。
  25. @Param:命名参数传递给 SQL。
  26. @Mapper:标记接口为 MyBatis Mapper。
  27. @MapperScan:启用 MyBatis Mapper 扫描。
  28. @EnableTransactionManagement:启用事务管理支持。

🔐 四、安全相关(Security)

  1. @EnableWebSecurity:启用 Spring Security。
  2. @EnableGlobalMethodSecurity:启用方法级安全控制。
  3. @PreAuthorize:前置权限判断。
  4. @PostAuthorize:后置权限判断。
  5. @Secured:基于角色的访问控制。
  6. @RolesAllowed:Java EE 标准权限注解。
  7. @AuthenticationPrincipal:获取认证用户信息。
  8. @EnableOAuth2Sso:启用 OAuth2 单点登录。
  9. @EnableResourceServer:启用资源服务器。
  10. @EnableAuthorizationServer:启用授权服务器。

🧪 五、测试相关(Testing)

  1. @RunWith(SpringRunner.class):JUnit 测试集成 Spring 上下文。
  2. @SpringBootTest:启动完整 Spring Boot 应用上下文。
  3. @DataJpaTest:仅加载 JPA 相关配置。
  4. @WebMvcTest:仅测试 Web 层(控制器)。
  5. @MockBean:模拟 Bean。
  6. @InjectMocks:注入被测试的类。
  7. @Before:JUnit 测试前准备。
  8. @After:JUnit 测试后清理。
  9. @Test:JUnit 测试方法。
  10. @DataMongoTest:仅加载 MongoDB 相关配置。
  11. @RestClientTest:测试 REST 客户端。
  12. @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT):启动随机端口 Web 环境。
  13. @DirtiesContext:测试后重置应用上下文。
  14. @Sql:执行 SQL 脚本。
  15. @DataRedisTest:仅加载 Redis 配置。

⚙️ 六、其他常用注解

  1. @ConditionalOnClass:当类路径存在某个类时生效。
  2. @ConditionalOnMissingBean:当容器中没有该 Bean 时生效。
  3. @ConditionalOnProperty:根据配置属性是否设置决定是否加载。
  4. @ConditionalOnExpression:根据 SpEL 表达式决定是否加载。
  5. @RefreshScope:配合 Spring Cloud Config 支持动态刷新配置。
  6. @EnableAsync:启用异步方法调用。
  7. @Async:标记异步方法。
  8. @Scheduled:定时任务注解。
  9. @EnableSwagger2:启用 Swagger 文档。
  10. @OpenAPIDefinition:OpenAPI 文档定义(Swagger 3+)。

提示:

  • 实际开发中并不需要掌握全部,根据项目需求选择使用。
  • 大部分注解来源于 Spring Framework、Spring Boot、Spring Data、Spring Security 等模块。
  • 如果你需要具体某个注解的详细说明或示例,可以告诉我。

希望对您有所帮助,我们下期再见ヾ(•ω•`)o

Spring Boot 项目中接入钉钉(DingTalk),通常是为了实现以下功能: - 发送工作通知消息(文本、图片、文件、链接等) - 获取用户信息(如免登登录、获取用户详情) - 上传文件/媒体 - 审批流程集成 - 群机器人消息推送 下面以 **发送工作通知消息** 和 **用户免登登录** 为例,详细介绍如何在 Spring Boot 中接入钉钉。 --- ### ✅ 一、准备工作 1. **注册钉钉开发者账号** 访问 [https://open-dev.dingtalk.com](https://open-dev.dingtalk.com) 2. **创建企业内部应用** - 进入「应用开发」→「企业内部开发」→ 创建应用 - 获取以下关键参数: - `appKey` - `appSecret` - `agentId` 3. **配置可信域名(用于前端 JSAPI 调用)** - 如果需要前端调用钉钉 JSAPI(如扫码登录、获取用户),需配置 HTTPS 可信域名 --- ### ✅ 二、Spring Boot 接入示例 #### 1. 添加依赖(`pom.xml`) ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> </dependencies> ``` --- #### 2. 配置 `application.yml` ```yaml dingtalk: app-key: your_app_key app-secret: your_app_secret agent-id: your_agent_id ``` --- #### 3. 工具类:获取 `access_token` ```java @Component @ConfigurationProperties(prefix = "dingtalk") public class DingTalkConfig { private String appKey; private String appSecret; private String agentId; // Getters and Setters public String getAppKey() { return appKey; } public void setAppKey(String appKey) { this.appKey = appKey; } public String getAppSecret() { return appSecret; } public void setAppSecret(String appSecret) { this.appSecret = appSecret; } public String getAgentId() { return agentId; } public void setAgentId(String agentId) { this.agentId = agentId; } } ``` ```java @Service public class DingTalkService { @Autowired private DingTalkConfig config; private String accessToken; private long expireTime = 0; // token过期时间戳 /** * 获取 access_token(带缓存,有效期7200秒) */ public String getAccessToken() throws Exception { if (System.currentTimeMillis() < expireTime && accessToken != null) { return accessToken; } String url = "https://oapi.dingtalk.com/gettoken?appkey=" + config.getAppKey() + "&appsecret=" + config.getAppSecret(); CloseableHttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); try (CloseableHttpResponse response = client.execute(httpGet)) { HttpEntity entity = response.getEntity(); String result = EntityUtils.toString(entity, "UTF-8"); ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(result); if (node.get("errcode").asInt() == 0) { accessToken = node.get("access_token").asText(); expireTime = System.currentTimeMillis() + 7100 * 1000; // 提前100秒刷新 return accessToken; } else { throw new RuntimeException("获取 access_token 失败: " + node.get("errmsg").asText()); } } } } ``` --- #### 4. 发送工作通知消息(文本示例) ```java public class TextMessage { private String msgtype = "text"; private Text text; // 构造函数 public TextMessage(String content) { this.text = new Text(content); } static class Text { private String content; public Text(String content) { this.content = content; } // getter/setter public String getContent() { return content; } public void setContent(String content) { this.content = content; } } // getter/setter public String getMsgtype() { return msgtype; } public void setMsgtype(String msgtype) { this.msgtype = msgtype; } public Text getText() { return text; } public void setText(Text text) { this.text = text; } } ``` ```java /** * 发送文本消息给指定用户 */ public boolean sendTextMessage(String userIds, String content) throws Exception { String token = getAccessToken(); String url = "https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=" + token; Map<String, Object> payload = new HashMap<>(); payload.put("agent_id", config.getAgentId()); payload.put("userid_list", userIds); // 用户ID列表,逗号分隔 payload.put("msg", new TextMessage(content)); CloseableHttpClient client = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); httpPost.setHeader("Content-Type", "application/json"); ObjectMapper mapper = new ObjectMapper(); httpPost.setEntity(new StringEntity(mapper.writeValueAsString(payload), "UTF-8")); try (CloseableHttpResponse response = client.execute(httpPost)) { String result = EntityUtils.toString(response.getEntity(), "UTF-8"); JsonNode node = mapper.readTree(result); return node.get("errcode").asInt() == 0; } } ``` --- #### 5. 控制器测试接口 ```java @RestController @RequestMapping("/dingtalk") public class DingTalkController { @Autowired private DingTalkService dingTalkService; @GetMapping("/send") public ResponseEntity<String> sendMsg(@RequestParam String userids, @RequestParam String content) { try { boolean success = dingTalkService.sendTextMessage(userids, content); return success ? ResponseEntity.ok("发送成功") : ResponseEntity.status(500).body("发送失败"); } catch (Exception e) { return ResponseEntity.status(500).body("异常: " + e.getMessage()); } } } ``` --- ### ✅ 三、用户免登登录(前端 + 后端) #### 前端(H5 页面中使用钉钉 JSAPI) ```html <script src="https://g.alicdn.com/dingding/open-develop/1.17.6/dingtalk.js"></script> <script> DD.config({ agentId: 'your_agent_id', corpId: 'your_corp_id', timeStamp: 123456789, nonceStr: 'random-string', signature: 'jsapi_signature', jsApiList: ['runtime.permission.requestAuthCode'] }); DD.runtime.permission.requestAuthCode({ corpId: "your_corp_id", onSuccess: function(result) { const code = result.code; // 将 code 发送给后端换取用户信息 fetch('/dingtalk/userinfo?code=' + code) .then(res => res.json()) .then(console.log); } }); </script> ``` #### 后端:通过 `code` 换取用户信息 ```java @GetMapping("/userinfo") public ResponseEntity<?> getUserInfo(@RequestParam String code) throws Exception { String token = getAccessToken(); String url = "https://oapi.dingtalk.com/user/getuserinfo?access_token=" + token + "&code=" + code; CloseableHttpClient client = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); try (CloseableHttpResponse response = client.execute(httpGet)) { String result = EntityUtils.toString(response.getEntity(), "UTF-8"); ObjectMapper mapper = new ObjectMapper(); JsonNode node = mapper.readTree(result); if (node.get("errcode").asInt() == 0) { String userId = node.get("userid").asText(); // 再次请求获取用户详情 return getUserDetail(token, userId); } return ResponseEntity.badRequest().body(node); } } private ResponseEntity<?> getUserDetail(String token, String userId) throws Exception { String url = "https://oapi.dingtalk.com/user/get?access_token=" + token + "&userid=" + userId; // ... 执行请求并返回用户详细信息 } ``` --- ### ✅ 四、佳实践建议 1. **统一封装钉钉客户端** - 使用 `RestTemplate` 或 `WebClient` 替代原生 HttpClient - 添加重试机制和日志记录 2. **敏感信息加密存储** - `appSecret` 不应明文存在配置文件中,可使用 Jasypt 加密 3. **异步发送消息** - 使用 `@Async` 注解避免阻塞主流程 4. **错误码处理** - 对常见错误码(如 40001、42007)做自动重试或告警 5. **监控与日志** - 记录每次调用钉钉 API 的请求/响应,便于排查问题 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员晓凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值