全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-18 8 分钟 ✍️ juanwangdev

自动装配

自动装配(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
来源SpringJSR-250
默认匹配按类型按名称
指定名称@Qualifiername属性
可选依赖required=false不支持

要点总结

  1. @Autowired是Spring注解,默认按类型装配
  2. @Resource是JSR-250标准,默认按名称装配
  3. 推荐使用构造器注入,依赖明确且便于测试
  4. 多候选Bean使用@Qualifier或@Primary指定
  5. 可选依赖使用@Autowired(required=false)或Optional

📝 发现内容有误?点击此处直接编辑

← 上一篇 Bean的继承
下一篇 → AOP代理
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库