本文最后更新于 2025-11-06,文章内容可能已经过时。

@ComponentScan、@Qualifier、@Primary、@Scope、@Lazy、@Profile、@CrossOrigin、@ResponseStatus @ModelAttribute

1. @ComponentScan

功能:配置 Spring 需要扫描的被组件注解注释的类所在的包路径。

使用场景:用于指定 Spring 容器扫描组件的包路径,是自动组件发现的基础。

详细说明

  • 通过 basePackagesvalue 属性配置需要扫描的包路径
  • valuebasePackages 的别名
  • 默认扫描注解所在包及其子包中的类
  • 作为 @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 灵活、简洁的配置机制,使开发者能够专注于业务逻辑,而不是繁琐的配置。