


为什么 Spring 推荐构造函数注入而非 @Autowired?


1. 使用 @Autowired 的问题

1.1 隐式依赖,降低代码可读性
示例:
public class OrderService {private UserRepository userRepository;private NotificationService notificationService;public void processOrder() {// 业务逻辑}}
1.2 不便于单元测试
示例:
(SpringRunner.class)public class OrderServiceTest {private OrderService orderService;private UserRepository userRepository;private NotificationService notificationService;public void testProcessOrder() {// 测试逻辑}}
1.3 空指针异常风险

2. 推荐的构造函数注入

2.1 使用构造函数注入
public class OrderService {private final UserRepository userRepository;private final NotificationService notificationService;// 构造函数注入public OrderService(UserRepository userRepository, NotificationService notificationService) {this.userRepository = userRepository;this.notificationService = notificationService;}public void processOrder() {// 业务逻辑}}
优点:
明确列出了类的依赖,代码更加清晰。
避免了字段级注入的空指针异常风险。
提升了代码的可测试性。
2.2 单元测试示例
import static org.mockito.Mockito.*;public class OrderServiceTest {private OrderService orderService;private UserRepository userRepository;private NotificationService notificationService;public void setUp() {userRepository = mock(UserRepository.class);notificationService = mock(NotificationService.class);orderService = new OrderService(userRepository, notificationService);}public void testProcessOrder() {// 测试逻辑}}
2.3 使用 Lombok 简化构造函数注入
示例:
public class OrderService {private final UserRepository userRepository;private final NotificationService notificationService;public void processOrder() {// 业务逻辑}}

3. 显式 Java 配置:另一种替代方案

示例:
public class AppConfig {public UserRepository userRepository() {return new UserRepositoryImpl();}public NotificationService notificationService() {return new EmailNotificationService();}public OrderService orderService(UserRepository userRepository, NotificationService notificationService) {return new OrderService(userRepository, notificationService);}}
优点:
所有依赖关系都在配置类中显式定义。
避免了组件扫描带来的不确定性。
更容易控制和调试 Bean 的创建过程。

4. 总结

构造函数注入 是一种更显式、安全和可维护的方式。
显式 Java 配置 提供了清晰的依赖管理方法。
-
Lombok 可以进一步简化构造函数注入的代码。

? 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。
欢迎关注我的公众号,期待与你一起探讨技术的无穷可能!目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。
加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。
此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作


