自动装配
自动装配(Autowiring)是Spring自动将依赖Bean注入到目标Bean的机制,无需手动配置依赖关系。
注解方式
@Autowired
Spring提供的注解,按类型自动装配。
Java
@Service
public class OrderService {
// 字段注入
@Autowired
private UserService userService;
// 构造器注入(推荐)
private final PaymentService paymentService;
@Autowired
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
// Setter注入
private NotificationService notificationService;
@Autowired
public void setNotificationService(NotificationService notificationService) {
this.notificationService = notificationService;
}
}
@Resource
JSR-250标准注解,默认按名称装配。
Java
@Service
public class OrderService {
@Resource
private UserService userService; // 按名称userService匹配
@Resource(name = "primaryPaymentService")
private PaymentService paymentService; // 指定Bean名称
}
@Inject
JSR-330标准注解,与@Autowired功能类似。
Java
@Inject
private UserService userService;
注入方式对比
| 注入方式 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|
| 构造器注入 | 依赖明确、不可变、易测试 | 参数多时冗长 | ⭐⭐⭐⭐⭐ |
| Setter注入 | 可选依赖、灵活 | 可能忘记注入 | ⭐⭐⭐ |
| 字段注入 | 简洁 | 难以测试、依赖隐藏 | ⭐⭐ |
多候选Bean处理
当同一类型有多个Bean时,需指定注入哪一个。
@Qualifier
Java
@Service
public class OrderService {
@Autowired
@Qualifier("primaryPaymentService")
private PaymentService paymentService;
}
@Primary
Java
@Component
@Primary // 优先注入
public class PrimaryPaymentService implements PaymentService {
}
@Component
public class BackupPaymentService implements PaymentService {
}
按名称匹配
Java
// 字段名与Bean名称一致
@Autowired
private PaymentService primaryPaymentService;
可选依赖
允许依赖不存在,避免启动报错。
Java
@Service
public class OrderService {
@Autowired(required = false) // 可选依赖
private OptionalService optionalService;
// 或使用Optional
@Autowired
private Optional<OptionalService> optionalService2;
// 或使用@Nullable
@Autowired
public void setService(@Nullable OptionalService service) {
this.service = service;
}
}
集合注入
注入某类型的所有Bean。
Java
@Service
public class PaymentService {
// 注入所有PaymentStrategy类型的Bean
@Autowired
private List<PaymentStrategy> strategies;
// 注入Map,key为Bean名称
@Autowired
private Map<String, PaymentStrategy> strategyMap;
}
XML自动装配
XML
<!-- byType:按类型自动装配 -->
<bean id="orderService" class="com.example.OrderService" autowire="byType"/>
<!-- byName:按名称自动装配 -->
<bean id="orderService" class="com.example.OrderService" autowire="byName"/>
<!-- constructor:构造器自动装配 -->
<bean id="orderService" class="com.example.OrderService" autowire="constructor"/>
@Autowired vs @Resource
| 特性 | @Autowired | @Resource |
|---|---|---|
| 来源 | Spring | JSR-250 |
| 默认匹配 | 按类型 | 按名称 |
| 指定名称 | @Qualifier | name属性 |
| 可选依赖 | required=false | 不支持 |
要点总结
- @Autowired是Spring注解,默认按类型装配
- @Resource是JSR-250标准,默认按名称装配
- 推荐使用构造器注入,依赖明确且便于测试
- 多候选Bean使用@Qualifier或@Primary指定
- 可选依赖使用@Autowired(required=false)或Optional
📝 发现内容有误?点击此处直接编辑