
一、核心 Bean 注册注解
1. @Component
- 作用:通用的 Spring 组件注解,标记一个类为 Spring 管理的 Bean。
- 适用场景:所有需要被 Spring IoC 容器管理的类(如工具类、通用组件等)。
- 特点:是其他更具体注解的父注解(如
@Service
,@Controller
,@Repository
)。
2. @Service
- 作用:语义化注解,标记一个类为业务逻辑层(Service 层)的 Bean。
- 适用场景:业务逻辑处理、事务管理、服务层类。
- 与
@Component
的关系:功能与@Component
完全相同,但通过命名表达代码的语义分层。
3. @Repository
- 作用:标记一个类为数据访问层(DAO 层)的 Bean。
- 适用场景:数据库操作、数据访问逻辑。
- 额外功能:自动将平台特定的异常(如 JDBC
SQLException
)转换为 Spring 的统一数据访问异常(如DataAccessException
)。
4. @Controller
- 作用:标记一个类为 Web 控制层(Controller 层)的 Bean。
- 适用场景:处理 HTTP 请求、返回视图(如 Thymeleaf、JSP)。
- 配合注解:通常与
@RequestMapping
、@GetMapping
等请求映射注解一起使用。
5. @RestController
- 作用:组合注解,等价于
@Controller
+@ResponseBody
。 - 适用场景:构建 RESTful API,直接返回 JSON/XML 数据,而非视图。
- 特点:Spring 4.0 引入,简化 REST 接口开发。
6. @Configuration
- 作用:标记一个类为配置类,定义 Bean 的创建和依赖关系。
- 适用场景:替代 XML 配置,通过
@Bean
方法显式声明 Bean。 - 配合注解:通常与
@Bean
一起使用。
7. @Bean
- 作用:在
@Configuration
类中标记一个方法,方法返回值会被注册为 Bean。 - 适用场景:需要复杂初始化逻辑的 Bean(如第三方库组件)。
- 与
@Component
的区别:@Bean
用于方法,而@Component
用于类。
二、其他相关注解
1. @ComponentScan
- 作用:配置 Spring 扫描 Bean 的包路径。
- 适用场景:自定义组件扫描范围(默认扫描启动类所在包及其子包)。
2. @Scope
- 作用:定义 Bean 的作用域(如单例
singleton
、原型prototype
等)。 - 适用场景:需要控制 Bean 生命周期时使用(如多例模式)。
三、常见误区:@RequestMapping
系列
@RequestMapping
、@GetMapping
、@PostMapping
等
这些注解用于定义 HTTP 请求映射规则,不用于注册 Bean,需与@Controller
或@RestController
配合使用。
四、异同对比表
注解 | 层级/场景 | 功能特点 | 是否派生自 @Component |
---|---|---|---|
@Component | 通用组件 | 基础 Bean 注册 | 是 |
@Service | 业务逻辑层 | 语义化标识业务服务 | 是 |
@Repository | 数据访问层 | 自动异常转换 | 是 |
@Controller | Web 控制层 | 处理 HTTP 请求和视图 | 是 |
@RestController | REST 控制层 | 直接返回数据(非视图) | 是(组合注解) |
@Configuration | 配置类 | 定义 @Bean 方法 | 是 |
@Bean | 方法级别 | 显式声明复杂 Bean | 否 |
五、使用建议
- 优先使用语义化注解:
- 业务层用
@Service
,数据层用@Repository
,控制层用@Controller
或@RestController
。 - 增强代码可读性,符合分层架构规范。
@Bean
用于复杂场景:
- 当需要手动控制 Bean 的创建逻辑时(如第三方库组件),使用
@Configuration
+@Bean
。
- 避免混淆:
@RequestMapping
系列注解仅用于路由映射,需配合@Controller
使用。
通过合理选择注解,可以更清晰地表达代码意图,并利用 Spring 的自动配置和功能增强(如异常转换)。
路由映射类注解详解
在 Spring Boot 中,@RequestMapping
系列注解是用于定义 HTTP 请求映射规则的注解,它们与 Bean 注册无关,但常被误认为是 Bean 注册的一部分。以下是详细解析:
一、@RequestMapping
系列注解的作用
这些注解用于将 HTTP 请求(如 GET、POST 等)映射到具体的 控制器方法 上,从而处理请求并返回响应。它们的核心功能是路由,而非注册 Bean。
1. @RequestMapping
- 功能:最基础的请求映射注解,支持定义 URL 路径和 HTTP 方法(如 GET、POST)。
- 示例:
@RequestMapping(value = "/example", method = RequestMethod.GET)
public String example() {
return "Hello";
}
- 特点:
- 需要手动指定 HTTP 方法(如
method = RequestMethod.GET
)。 - 可作用于类或方法级别:
- 类级别:定义公共路径前缀(如
/api
)。 - 方法级别:定义具体路径和 HTTP 方法。
- 类级别:定义公共路径前缀(如
2. @GetMapping
- 功能:等价于
@RequestMapping(method = RequestMethod.GET)
,简化 GET 请求映射。 - 示例:
@GetMapping("/example")
public String example() {
return "Hello";
}
3. @PostMapping
、@PutMapping
、@DeleteMapping
、@PatchMapping
- 功能:分别对应 HTTP 的 POST、PUT、DELETE、PATCH 方法,简化特定方法的映射。
- 示例:
@PostMapping("/create")
public String create() {
return "Created";
}
4. @RestController
与 @Controller
@Controller
:- 标记一个类为控制器,处理 HTTP 请求。
- 返回的字符串通常对应视图名称(如 JSP、Thymeleaf)。
@RestController
:- 组合注解:
@Controller
+@ResponseBody
。 - 直接返回数据(如 JSON/XML),而非视图。
- 示例:
java @RestController public class ApiController { @GetMapping("/data") public Data getData() { return new Data("value"); } }
二、常见误区
1. 误认为 @RequestMapping
系列注解会注册 Bean
- 问题:单独使用
@RequestMapping
或@GetMapping
等注解不会将类注册为 Bean。 - 正确做法:
- 必须结合
@Controller
或@RestController
使用,这些注解才是真正的 Bean 注册注解。 - 错误示例:
java // 缺少 @Controller/@RestController,此类不会被 Spring 管理 public class MyController { @GetMapping("/test") public String test() { return "Fail"; } }
2. 混淆 @RestController
和 @Controller
- 问题:
- 在
@Controller
类中直接返回数据(如字符串或对象),未添加@ResponseBody
,导致 Spring 尝试查找视图。 - 示例:
@Controller
public class MyController {
@GetMapping("/data")
public Data getData() {
return new Data("value"); // 会报错:找不到视图模板
}
}
- 解决方案:
- 使用
@RestController
替代@Controller
,或为方法添加@ResponseBody
。
3. 路径冲突或模糊匹配
- 问题:
- 不同方法的 URL 路径设计冲突,导致请求被错误路由。
- 示例:
@GetMapping("/user/{id}")
public String getUserById(@PathVariable String id) { /* ... */ }
@GetMapping("/user/name")
public String getUserByName() { /* ... */ }
- 当请求
/user/name
时,可能被第一个方法误匹配为id=name
。 - 解决方案:
- 调整路径设计,避免模糊匹配(如
/user/id/{id}
和/user/name
)。
三、与其他注解的关系
1. @ResponseBody
- 功能:将方法返回值直接写入 HTTP 响应体(而非视图)。
- 使用场景:
- 与
@Controller
配合实现 REST API。 - 被
@RestController
隐式包含。
2. @PathVariable
和 @RequestParam
- 作用:处理请求中的动态参数。
- 示例:
@GetMapping("/user/{id}")
public String getUser(@PathVariable String id, @RequestParam String name) {
return "ID: " + id + ", Name: " + name;
}
四、使用建议
- 优先使用特定 HTTP 方法注解:
- 用
@GetMapping
替代@RequestMapping(method = GET)
,提升代码可读性。
- 明确路径设计:
- 避免路径冲突,合理使用路径变量(
{variable}
)和查询参数。
- 组合使用注解:
- 在类级别用
@RequestMapping
定义公共路径前缀,方法级别用@GetMapping
等定义具体操作。
@RestController
@RequestMapping("/api/v1")
public class ApiController {
@GetMapping("/users")
public List<User> getUsers() { /* ... */ }
}
五、总结
@RequestMapping
系列注解用于路由,而非注册 Bean。- 必须与
@Controller
或@RestController
配合使用,否则无法处理请求。 - 合理选择注解(如
@GetMapping
vs@PostMapping
),可提升代码清晰度和维护性。