SpringBoot中常用的注解有哪些

发布时间:2021-12-11 15:28:48 作者:小新
来源:亿速云 阅读:700
# SpringBoot中常用的注解有哪些

## 目录
1. [引言](#引言)
2. [核心注解](#核心注解)
3. [Web开发相关注解](#web开发相关注解)
4. [数据访问相关注解](#数据访问相关注解)
5. [配置相关注解](#配置相关注解)
6. [测试相关注解](#测试相关注解)
7. [AOP相关注解](#aop相关注解)
8. [定时任务相关注解](#定时任务相关注解)
9. [缓存相关注解](#缓存相关注解)
10. [安全相关注解](#安全相关注解)
11. [其他实用注解](#其他实用注解)
12. [总结](#总结)

---

## 引言

Spring Boot作为当前Java领域最流行的微服务框架,其核心优势之一就是通过注解(Annotation)极大简化了开发配置。本文将系统性地介绍Spring Boot中常用的注解,涵盖从项目启动到各功能模块的开发实践,帮助开发者快速掌握Spring Boot的核心开发技巧。

> **注解的作用**:  
> - 替代XML配置,实现声明式编程  
> - 自动装配Bean依赖  
> - 定义组件生命周期  
> - 实现AOP、事务管理等横切关注点

---

## 核心注解

### 1. @SpringBootApplication
**组合注解**,包含以下三个核心功能:
```java
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public @interface SpringBootApplication {}

2. @Bean

在配置类中声明方法返回值作为Bean:

@Configuration
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

3. @Autowired

自动注入依赖(推荐使用构造函数注入):

@Service
public class UserService {
    private final UserRepository repository;
    
    @Autowired // Spring 4.3+ 可省略
    public UserService(UserRepository repository) {
        this.repository = repository;
    }
}

4. @Component及其衍生注解

注解 适用场景
@Component 通用组件
@Service 业务逻辑层
@Repository 数据访问层
@Controller Web控制器
@RestController REST API控制器

Web开发相关注解

1. 请求映射注解

注解 HTTP方法 示例
@RequestMapping 通用 @RequestMapping("/api")
@GetMapping GET @GetMapping("/users")
@PostMapping POST @PostMapping("/users")
@PutMapping PUT @PutMapping("/users/{id}")
@DeleteMapping DELETE @DeleteMapping("/users/{id}")

2. 参数处理注解

@GetMapping("/users/{id}")
public User getUser(
    @PathVariable Long id,
    @RequestParam(required = false) String name,
    @RequestBody UserDTO userDto,
    @RequestHeader("User-Agent") String userAgent) {
    // ...
}

3. 响应处理注解

@RestController
public class UserController {
    
    @GetMapping("/users")
    public ResponseEntity<List<User>> listUsers() {
        return ResponseEntity.ok().header("X-Custom","value").body(users);
    }
    
    @ResponseStatus(HttpStatus.CREATED)
    @PostMapping("/users")
    public void createUser(@Valid @RequestBody User user) {
        // ...
    }
}

4. 异常处理

@ControllerAdvice
public class GlobalExceptionHandler {
    
    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ErrorResponse handleNotFound(ResourceNotFoundException ex) {
        return new ErrorResponse(ex.getMessage());
    }
}

数据访问相关注解

1. JPA注解

@Entity
@Table(name = "users")
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @Column(nullable = false, length = 50)
    private String username;
    
    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
    private List<Order> orders;
}

2. 事务管理

@Service
@Transactional
public class OrderService {
    
    @Transactional(propagation = Propagation.REQUIRED, 
                  isolation = Isolation.READ_COMMITTED,
                  timeout = 30)
    public void placeOrder(Order order) {
        // 数据库操作
    }
}

配置相关注解

1. 属性配置

@Configuration
@PropertySource("classpath:app.properties")
public class AppConfig {
    
    @Value("${app.page.size:10}")
    private int pageSize;
    
    @Bean
    @ConfigurationProperties(prefix = "datasource")
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

2. 条件装配

@Configuration
@ConditionalOnClass(DataSource.class)
@ConditionalOnProperty(name = "datasource.enabled", havingValue = "true")
public class DataSourceAutoConfig {
    // ...
}

测试相关注解

@SpringBootTest
@AutoConfigureMockMvc
class UserControllerTest {
    
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private UserService userService;
    
    @Test
    @DisplayName("测试获取用户列表")
    void shouldReturnUserList() throws Exception {
        mockMvc.perform(get("/users"))
               .andExpect(status().isOk())
               .andExpect(jsonPath("$[0].username").value("admin"));
    }
}

AOP相关注解

@Aspect
@Component
public class LoggingAspect {
    
    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceLayer() {}
    
    @Before("serviceLayer()")
    public void logMethodCall(JoinPoint jp) {
        Logger.info("调用方法: " + jp.getSignature());
    }
    
    @Around("@annotation(com.example.audit.Loggable)")
    public Object logExecutionTime(ProceedingJoinPoint pjp) throws Throwable {
        long start = System.currentTimeMillis();
        Object result = pjp.proceed();
        Logger.info("方法执行耗时: " + (System.currentTimeMillis() - start));
        return result;
    }
}

定时任务相关注解

@Configuration
@EnableScheduling
public class ScheduleConfig {
    
    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        System.out.println("定时任务执行: " + LocalDateTime.now());
    }
    
    @Scheduled(cron = "0 15 10 * * ?")
    public void dailyJob() {
        // 每天上午10:15触发
    }
}

缓存相关注解

@Service
@CacheConfig(cacheNames = "users")
public class UserService {
    
    @Cacheable(key = "#id")
    public User getUser(Long id) {
        return repository.findById(id).orElse(null);
    }
    
    @CachePut(key = "#user.id")
    public User updateUser(User user) {
        return repository.save(user);
    }
    
    @CacheEvict(key = "#id")
    public void deleteUser(Long id) {
        repository.deleteById(id);
    }
}

安全相关注解

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin();
    }
}

@RestController
@RequestMapping("/api")
public class ApiController {
    
    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/admin")
    public String adminOnly() {
        return "Admin Area";
    }
}

其他实用注解

1. 异步处理

@Service
public class AsyncService {
    
    @Async
    public CompletableFuture<String> asyncTask() {
        // 长时间运行的任务
        return CompletableFuture.completedFuture("Result");
    }
}

2. 验证注解

public class UserDTO {
    
    @NotBlank
    @Size(min = 3, max = 20)
    private String username;
    
    @Email
    private String email;
    
    @Pattern(regexp = "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$")
    private String password;
}

3. Swagger文档

@RestController
@Api(tags = "用户管理API")
public class UserController {
    
    @ApiOperation("获取用户列表")
    @GetMapping("/users")
    public List<User> listUsers() {
        // ...
    }
}

总结

Spring Boot通过丰富的注解体系,实现了以下优势: 1. 配置简化:减少XML配置90%以上 2. 开发效率:快速构建生产级应用 3. 可维护性:清晰的代码组织结构 4. 生态整合:轻松集成各种中间件

建议开发者: - 理解注解背后的实现原理(如自动配置机制) - 根据业务场景选择合适的注解组合 - 关注Spring Boot版本更新带来的新注解特性

最佳实践:对于企业级应用,建议建立自定义注解规范,如@BusinessLog用于统一业务日志记录。

”`

注:本文实际约4500字,要达到6650字需要进一步扩展以下内容: 1. 每个注解的详细使用场景和示例 2. 常见问题排查方案 3. 性能优化建议 4. 与其他框架的整合案例 5. 自定义注解开发指南 需要补充内容可告知具体方向。

推荐阅读:
  1. spring和springboot常用注解总结
  2. 二、Springboot 常用注解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot

上一篇:Tomcat9中容器结构与生命周期的示例分析

下一篇:怎么用Java设计一个短链接生成系统

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》