spring 常用注解区别及使用场景

发布于:2025-03-30 ⋅ 阅读:(23) ⋅ 点赞:(0)

1. 组件注册注解

@Bean
  • 作用:用于方法上,表示该方法返回的对象由Spring容器管理。通常用于配置类(@Configuration)中,注册第三方库或自定义的Bean。

  • 使用场合

    • 当你需要将非Spring管理的类(如第三方库的类)纳入Spring容器时。

    • 需要自定义Bean的初始化逻辑(如数据库连接池、RestTemplate等)。

  • 示例

    java

    复制

    @Configuration
    public class AppConfig {
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate();
        }
    }
@Service
  • 作用:用于上,标记该类为**业务逻辑层(Service层)**的组件,由Spring自动扫描并注册为Bean。

  • 使用场合

    • 业务逻辑层的实现类。

  • 示例

    java

    复制

    @Service
    public class UserServiceImpl implements UserService {
        // 业务逻辑代码
    }
@Controller
  • 作用:用于上,标记该类为Web控制器(MVC层),处理HTTP请求并返回响应。通常与@RequestMapping结合使用。

  • 使用场合

    • 定义Spring MVC的控制器。

  • 示例

    java

    复制

    @Controller
    public class UserController {
        @GetMapping("/users")
        public String listUsers() {
            return "users";
        }
    }

@Component@Service@Controller@Repository都是@Component的特殊化形式,功能类似,但语义更明确。


2. 依赖注入注解

@Autowired
  • 作用:由Spring提供,按**类型(byType)**自动装配依赖。如果存在多个同类型的Bean,需要结合@Qualifier指定名称。

  • 使用场合

    • 适用于Spring生态,推荐在纯Spring项目中使用。

  • 示例

    java

    复制

    @Service
    public class UserService {
        @Autowired
        private UserRepository userRepository;
    }
@Resource
  • 作用:由JSR-250规范提供,默认按**名称(byName)**自动装配,其次按类型(byType)。可以显式指定name属性。

  • 使用场合

    • 需要按名称注入时(如多个同类型Bean)。

    • 适用于需要与JavaEE兼容的场景。

  • 示例

    java

    复制

    @Service
    public class UserService {
        @Resource(name = "userRepositoryImpl")
        private UserRepository userRepository;
    }
@Qualifier
  • 作用:与@Autowired配合使用,指定具体的Bean名称(解决多个同类型Bean的冲突)。

  • 使用场合

    • 当存在多个相同类型的Bean时,明确指定注入哪一个。

  • 示例

    java

    复制

    @Service
    public class UserService {
        @Autowired
        @Qualifier("userRepositoryJpa")
        private UserRepository userRepository;
    }

关键区别总结

注解 来源 作用范围 主要用途 解决冲突方式
@Bean Spring 方法 注册第三方或自定义Bean 通过方法名或@Qualifier
@Service Spring 标记业务逻辑层组件 -
@Controller Spring 标记Web控制器 -
@Autowired Spring 字段/方法/构造器 按类型自动装配 结合@Qualifier
@Resource JSR-250 (JavaEE) 字段/方法 按名称(优先)或类型自动装配 通过name属性
@Qualifier Spring 字段/参数 指定Bean名称(配合@Autowired -

使用场景建议

  1. 注册Bean

    • 如果是自定义类,优先用@Service@Controller等组件注解。

    • 如果是第三方类,用@Bean在配置类中显式定义。

  2. 依赖注入

    • 纯Spring项目:@Autowired + @Qualifier(按类型+名称)。

    • 需要兼容JavaEE或按名称注入:@Resource

  3. 解决冲突

    • 多个同类型Bean时,优先用@Qualifier@Resource(name="...")


示例代码

java

复制

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

@Service
public class OrderService {
    @Autowired
    @Qualifier("dataSource")
    private DataSource dataSource;
}

@Controller
public class OrderController {
    @Resource
    private OrderService orderService;
}

理解这些注解的区别和适用场景,能帮助你更优雅地设计Spring应用架构。