使用构造函数注入和接口编程实现松耦合,通过spring框架的@Component与@Autowired注解自动装配Bean,或在无框架时采用工厂模式分离依赖创建,提升代码可测试性与可维护性。

在Java中实现依赖注入(Dependency Injection, DI)与松耦合,核心是将对象之间的依赖关系从硬编码中剥离,交由外部容器或机制管理。这样可以提升代码的可测试性、可维护性和扩展性。
使用构造函数注入实现松耦合
构造函数注入是最推荐的方式,它确保依赖在对象创建时就被明确提供,有利于不可变性和完整性校验。
- 将依赖通过构造方法传入,避免在类内部直接new具体实现
- 配合接口编程,使调用方只依赖抽象而非具体类
示例:
定义服务接口:
立即学习“Java免费学习笔记(深入)”;
public Interface MessageService {
void send(String msg);
}
实现类:
public class EmailService implements MessageService {
public void send(String msg) {
System.out.println(“发送邮件: ” + msg);
}
}
使用构造注入的客户端:
public class Notification {
private final MessageService service;
public Notification(MessageService service) {
this.service = service;
}
public void notifyUser(String msg) {
service.send(msg);
}
}
这样,Notification不关心具体使用哪种消息服务,实现了与实现类的解耦。
借助spring框架自动装配
Spring是Java中最常用的依赖注入框架,通过注解简化配置。
- @Component:标记类为Spring Bean
- @Autowired:自动注入匹配的Bean
- @Qualifier:指定具体Bean名称,解决多实现冲突
示例:
@Component
public class SMSService implements MessageService {
public void send(String msg) {
System.out.println(“发送短信: ” + msg);
}
}
@Component
public class app {
@Autowired
private MessageService service;
public void run() {
service.send(“Hello”);
}
}
spring容器会自动创建Bean并完成注入,无需手动new对象。
使用工厂模式辅助手动DI
在不使用框架的场景下,可通过简单工厂或服务定位器模式实现依赖解耦。
例如定义一个工厂:
public class ServiceFactory {
public Static MessageService getService() {
// 可根据配置返回不同实现
return new EmailService();
}
}
然后在主逻辑中:
Notification notification = new Notification(ServiceFactory.getService());
这种方式虽不如Spring灵活,但也能有效降低耦合度。
基本上就这些。关键在于把“谁来创建依赖”这个问题交给更高层处理,而不是让类自己决定。这样改实现、写单元测试都会方便很多。


