@Qualifier、@Primary、@Scope、@Lazy等注解
本文最后更新于 2025-11-06,文章内容可能已经过时。
@ComponentScan、@Qualifier、@Primary、@Scope、@Lazy、@Profile、@CrossOrigin、@ResponseStatus @ModelAttribute
1. @ComponentScan
功能:配置 Spring 需要扫描的被组件注解注释的类所在的包路径。
使用场景:用于指定 Spring 容器扫描组件的包路径,是自动组件发现的基础。
详细说明:
- 通过
basePackages或value属性配置需要扫描的包路径 value是basePackages的别名- 默认扫描注解所在包及其子包中的类
- 作为
@SpringBootApplication的一部分,它自动启用组件扫描
示例:
// 扫描 com.example.service 包
@ComponentScan(basePackages = "com.example.service")
// 或
@ComponentScan(value = "com.example.service")
// 通常不需要单独使用,因为 @SpringBootApplication 已包含它
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
2. @Qualifier
功能:当有多个同类型 Bean 时,指定注入的 Bean 名称。
使用场景:当存在多个相同类型的 Bean 时,用于精确指定要注入的 Bean。
详细说明:
- 与
@Autowired配合使用 - 用于解决多个相同类型 Bean 的注入歧义问题
- 可以进行更细粒度的控制如何选择候选者
示例:
// 定义两个不同名称的 Bean
@Service("userService")
public class UserServiceImpl implements UserService {
// ...
}
@Service("adminUserService")
public class AdminUserServiceImpl implements UserService {
// ...
}
// 在注入时指定具体使用哪个 Bean
@Autowired
@Qualifier("adminUserService")
private UserService userService;
3. @Primary
功能:标记一个 Bean 为首选的 Bean。
使用场景:当有多个相同类型的 Bean 时,Spring 会优先选择被 @Primary 标记的 Bean。
详细说明:
- 用于解决多个相同类型 Bean 的注入歧义问题
- 与
@Qualifier不同,@Primary是默认选择,不需要指定名称 - 通常用于提供默认实现
示例:
// 默认的 UserService 实现
@Service
@Primary
public class DefaultUserServiceImpl implements UserService {
// ...
}
// 其他 UserService 实现
@Service
public class AdvancedUserServiceImpl implements UserService {
// ...
}
// 注入时会自动使用 @Primary 标记的 DefaultUserServiceImpl
@Autowired
private UserService userService;
4. @Scope
功能:指定 Bean 的作用域。
使用场景:控制 Bean 的生命周期和创建方式。
详细说明:
- 常见作用域:singleton(默认)、prototype、request、session、application
singleton:每个 Spring 容器中只有一个实例prototype:每次请求都创建新实例request:每个 HTTP 请求创建一个新实例session:每个 HTTP Session 创建一个新实例
示例:
// 单例(默认,可以省略)
@Component
@Scope("singleton")
public class SingletonBean {
// ...
}
// 原型(每次请求都创建新实例)
@Component
@Scope("prototype")
public class PrototypeBean {
// ...
}
5. @Lazy
功能:延迟初始化 Bean。
使用场景:当 Bean 初始化耗时较长,或者依赖的其他 Bean 尚未准备好时。
详细说明:
- 使用
@Lazy注解后,Bean 不会在应用程序启动时立即创建 - 而是在第一次被请求时才创建
- 可以用于解决循环依赖问题
示例:
// 延迟初始化的 Bean
@Component
@Lazy
public class LazyInitializedBean {
// ...
}
// 在需要时注入
@Service
public class SomeService {
@Autowired
private LazyInitializedBean lazyBean; // 只有在使用时才创建
}
6. @Profile
功能:指定 Bean 在特定的环境配置下才被创建。
使用场景:多环境配置(开发、测试、生产环境)。
详细说明:
- 用于标记 Bean 仅在特定配置文件中生效
- 通过 spring.profiles.active属性激活特定配置
示例:
// 仅在开发环境激活
@Component
@Profile("dev")
public class DevConfig {
// ...
}
// 仅在生产环境激活
@Component
@Profile("prod")
public class ProdConfig {
// ...
}
在 application.properties 中设置:
# 激活开发环境
spring.profiles.active=dev
7. @CrossOrigin
功能:提供跨域调用支持。
使用场景:解决前端应用与后端 API 之间的跨域问题。
详细说明:
- 可以标注在类或方法级别
- 如果标注在类上,类中的所有方法都获得跨域支持
- 可以微调跨域行为,如指定允许的源、方法、头部等
示例:
// 允许所有源、方法和头部的跨域请求
@RestController
@CrossOrigin
public class UserController {
@GetMapping("/users")
public List<User> getUsers() {
return userService.findAll();
}
}
// 更具体的配置
@RestController
@CrossOrigin(origins = "http://example.com", methods = {RequestMethod.GET, RequestMethod.POST})
public class UserController {
// ...
}
8. @ResponseStatus
功能:设置 HTTP 响应状态码。
使用场景:在控制器方法中指定特定的 HTTP 状态码。
详细说明:
- 用于指定控制器方法返回的 HTTP 状态码
- 通常用于处理异常或特定业务逻辑
示例:
@RestController
public class UserController {
// 当用户不存在时返回 404
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) {
User user = userService.findById(id);
if (user == null) {
throw new ResourceNotFoundException();
}
return user;
}
}
// 异常处理
@ResponseStatus(HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
// ...
}
9. @ModelAttribute
功能:将方法的返回值绑定到模型,或者从模型中获取数据。
使用场景:在控制器方法执行前,将数据添加到模型中。
详细说明:
- 如果使用
@ModelAttribute对方法进行标注,Spring 会将方法的返回值绑定到具体的 Model 上 - 在 Spring 调用具体的处理方法之前,被
@ModelAttribute注解标注的所有方法都将被执行 - 如果参数名与模型具有相同的名字,则不必指定索引名称
示例:
// 用于在控制器方法执行前准备数据
@ModelAttribute("user")
public User prepareUser() {
return new User("John Doe");
}
// 用于获取已存在的模型数据
@GetMapping("/profile")
public String profile(@ModelAttribute("user") User user) {
return "profile";
}
// 更简单的用法(参数名与模型名一致)
@GetMapping("/profile")
public String profile(@ModelAttribute User user) {
return "profile";
}
总结
以上是 Spring Boot 中常用的注解详解。这些注解在 Spring Boot 应用开发中扮演着重要角色,能够帮助开发者简化配置、提高代码可读性和可维护性。理解并正确使用这些注解是掌握 Spring Boot 开发的关键。
- 组件扫描:
@ComponentScan用于组件发现 - 依赖注入:
@Autowired、@Qualifier、@Primary用于精确控制依赖注入 - 作用域与生命周期:
@Scope、@Lazy控制 Bean 的创建方式和时机 - 环境配置:
@Profile用于多环境配置 - Web 开发:
@CrossOrigin、@ResponseStatus、@ModelAttribute用于处理 Web 请求和响应
这些注解共同构成了 Spring Boot 灵活、简洁的配置机制,使开发者能够专注于业务逻辑,而不是繁琐的配置。
- 感谢你赐予我前进的力量

