依赖倒置原则要求高层模块和低层模块都依赖抽象,抽象不依赖细节;Java中通过接口或抽象类定义抽象,由外部注入具体实现来解耦,如UserService依赖UserRepository接口而非其实现类。

依赖倒置(Dependency Inversion Principle,DIP)是面向对象设计中SOLID五大原则之一,核心思想是高层模块不应依赖低层模块,二者都应依赖抽象;抽象不应依赖细节,细节应依赖抽象。在Java中,它不是语法特性,而是一种设计指导思想,通过接口、抽象类等抽象机制来解耦模块间的依赖关系。
不遵守依赖倒置时,常见写法是高层类直接new低层类实例:
❌ 反例(紧耦合):class UserService {
private MySQLUserRepository repository = new MySQLUserRepository(); // 直接依赖具体实现
}这样会导致:数据库换为Redis或MongoDB时,必须修改UserService;单元测试难以Mock;可维护性和可扩展性差。
关键在于将“依赖具体实现”改为“依赖抽象”,再通过外部注入具体实现:
立即学习“Java免费学习笔记(深入)”;
UserRepository
MySQLUserRepository、RedisUserRepository)UserService)只持有接口类型字段,并通过构造器/Setter注入具体实现✅ 正例(符合DIP):
interface UserRepository {
User findById(Long id);
}
<p>class MySQLUserRepository implements UserRepository { /<em> ... </em>/ }
class RedisUserRepository implements UserRepository { /<em> ... </em>/ }</p><p>class UserService {
private final UserRepository repository; // 依赖抽象,不关心谁实现</p><pre class="brush:php;toolbar:false;">public UserService(UserRepository repository) { // 构造注入
this.repository = repository;
}}
依赖倒置是设计原则,强调“谁依赖谁”的方向;依赖注入(DI)是实现手段,解决“怎么把依赖给进来”的问题。Spring框架的@Autowired、构造器注入等,都是落实依赖倒置的常用方式。但即使不用Spring,手动传入实现类(比如测试时传入Mock对象),也已体现DIP思想。
以上就是Java面向对象设计中依赖倒置是什么_依赖倒置在Java中的实现解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号