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 ) |
- |
使用场景建议
注册Bean:
如果是自定义类,优先用
@Service
、@Controller
等组件注解。如果是第三方类,用
@Bean
在配置类中显式定义。
依赖注入:
纯Spring项目:
@Autowired
+@Qualifier
(按类型+名称)。需要兼容JavaEE或按名称注入:
@Resource
。
解决冲突:
多个同类型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应用架构。