好的,Spring Boot 的注解体系是其"约定大于配置"理念的核心体现。下面我将这些注解分为几大类,并附上解释和示例,方便你理解和记忆。
一、项目启动与核心配置注解
这些是 Spring Boot 应用的基石。
注解 | 作用 | 示例 |
---|---|---|
@SpringBootApplication |
核心注解 ,用于主类。是 @SpringBootConfiguration 、@EnableAutoConfiguration 、@ComponentScan 的组合注解。标记此为启动类。 |
@SpringBootApplication public class MyApplication { ... } |
@SpringBootTest |
测试注解,用于测试类。会启动一个用于测试的 Spring 应用上下文(容器)。 | @SpringBootTest class MyServiceTest { ... } |
@Configuration |
标记一个类为配置类 ,相当于一个 XML 配置文件,内部可声明 @Bean 。 |
@Configuration public class AppConfig { ... } |
@ConfigurationProperties |
将配置文件(如 application.yml )中的属性批量绑定到一个 Java Bean 上。 |
@ConfigurationProperties(prefix = "app.datasource") public class DataSourceProps { ... } |
@Value |
属性注入,直接将配置文件中的某个属性值注入到字段中。 | @Value("${app.page-size}") private int pageSize; |
二、定义 Bean 及依赖注入的注解
这些注解用于创建和组装组件。
注解 | 作用 | 示例 |
---|---|---|
@Component |
通用注解,标记一个类为 Spring 的组件(Bean),会被容器扫描并创建实例。 | @Component public class MyService { ... } |
@Service |
语义化注解 ,功能同 @Component ,但通常用于标注业务逻辑层(Service 层)的类。 |
@Service public class UserServiceImpl { ... } |
@Repository |
语义化注解 ,功能同 @Component ,但通常用于标注数据访问层(DAO 层)的类。会自动处理数据库异常。 |
@Repository public class UserRepository { ... } |
@Controller |
标记一个类为 Spring MVC 控制器,主要用于接收 Web 请求。 | @Controller public class UserController { ... } |
@RestController |
@Controller 和 @ResponseBody 的组合注解。标记的类所有方法返回的数据都直接写入响应体(JSON/XML),用于构建 RESTful API。 |
@RestController public class UserApiController { ... } |
@Autowired |
依赖注入,自动按照类型(byType)注入依赖。可用于字段、setter 方法、构造方法。 | @Autowired private UserService userService; |
@Bean |
通常在配置类(@Configuration )中使用,方法级别注解。将方法返回的对象声明为一个 Bean,交于 Spring 容器管理。 |
@Bean public RestTemplate restTemplate() { return new RestTemplate(); } |
三、Web MVC 相关注解(Controller 层)
这些注解用于处理 HTTP 请求和响应。
注解 | 作用 | 示例 |
---|---|---|
@RequestMapping |
映射请求,将 HTTP 请求映射到 MVC 控制器的方法上。可简化如下注解。 | @RequestMapping("/api/users") |
@GetMapping |
映射 HTTP GET 请求。 | @GetMapping("/{id}") public User getUser(@PathVariable Long id) { ... } |
@PostMapping |
映射 HTTP POST 请求。 | @PostMapping public User createUser(@RequestBody User user) { ... } |
@PutMapping |
映射 HTTP PUT 请求。 | @PutMapping("/{id}") ... |
@DeleteMapping |
映射 HTTP DELETE 请求。 | @DeleteMapping("/{id}") ... |
@PathVariable |
将 URL 模板变量绑定到方法参数。 | getUser(@PathVariable("id") Long userId) |
@RequestParam |
将请求参数 (如 ?name=John )绑定到方法参数。 |
getUsers(@RequestParam(defaultValue="0") int page) |
@RequestBody |
将 HTTP 请求体(如 JSON)绑定到方法参数对象。 | createUser(@RequestBody @Valid User user) |
@ResponseBody |
将方法返回值直接写入 HTTP 响应体,而不是视图解析。 | @ResponseBody public User getUser() { ... } |
@RestControllerAdvice |
全局异常处理 ,结合 @ExceptionHandler 使用,用于统一处理控制器层的异常。 |
@RestControllerAdvice public class GlobalExceptionHandler { ... } |
四、数据访问相关注解(DAO 层)
主要用于 Spring Data JPA 或 MyBatis。
注解 | 作用 | 示例 |
---|---|---|
@Entity |
JPA 注解,标记一个类为数据库实体,对应一张表。 | @Entity @Table(name = "users") public class User { ... } |
@Id |
JPA 注解,声明实体类的主键字段。 | @Id private Long id; |
@Repository |
如上所述,用于 DAO 层组件。 | |
@Transactional |
声明式事务管理,标记方法或类需要事务支持。 | @Transactional public void updateUser(User user) { ... } |
五、其他常用注解
注解 | 作用 | 示例 |
---|---|---|
@Profile |
环境切换,指定某个 Bean 或配置只在特定环境(如 dev, test, prod)下生效。 | @Bean @Profile("dev") public DataSource devDataSource() { ... } |
@ConditionalOnProperty |
条件化配置,根据配置文件中的属性值来决定是否创建某个 Bean。 | @Bean @ConditionalOnProperty(name = "app.feature.cache", havingValue = "true") public CacheManager cacheManager() { ... } |
@Valid |
参数校验 ,与 @RequestBody 等配合使用,触发对对象属性的校验规则(如 @NotNull , @Email )。 |
createUser(@RequestBody @Valid User user) |
@Slf4j |
Lombok 注解 ,为类自动注入一个 log 对象,用于日志记录。需安装 Lombok 插件。 |
@Slf4j @RestController public class MyController { ... log.info("This is a log."); } |
总结
要快速掌握,可以记住这个核心流程:
-
启动 :主类上用
@SpringBootApplication
。 -
定义 Bean:
- Controller 用
@RestController
。 - Service 用
@Service
。 - Dao 用
@Repository
。 - 配置类用
@Configuration
和@Bean
。
- Controller 用
-
注入 Bean :在需要的地方用
@Autowired
。 -
处理 Web 请求 :在 Controller 的方法上用
@GetMapping
/@PostMapping
等,参数用@PathVariable
/@RequestBody
。 -
操作数据 :在 Service 方法上用
@Transactional
保证事务。
建议你边学边练,创建一个简单的 Spring Boot 项目(比如一个 User 的 CRUD 接口),把这些注解实际用一遍,理解会深刻得多。