在 Java 中,依赖注入(Dependency Injection,DI)是一种设计思想,用来把对象所依赖的其他对象“外部传入”,而不是在对象内部自己创建,从而降低耦合、方便测试和扩展。
下面从原理 → 手写实现 → 框架实现三个层次说明。
传统方式(紧耦合)
class Service {
public void doSomething() {}
}
class Controller {
private Service service = new Service(); // 自己创建
}
依赖注入方式(松耦合)
class Controller {
private Service service;
// 由外部把依赖传进来
public Controller(Service service) {
this.service = service;
}
}
✅ 好处:
interface MessageService {
void send();
}
class EmailService implements MessageService {
public void send() {
System.out.println("发送邮件");
}
}
class UserController {
private MessageService service;
public UserController(MessageService service) {
this.service = service;
}
public void notifyUser() {
service.send();
}
}
public class Main {
public static void main(String[] args) {
MessageService service = new EmailService();
UserController controller = new UserController(service);
controller.notifyUser();
}
}
✅ 这就是 最原始的依赖注入
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.30</version>
</dependency>
@Service
public class EmailService implements MessageService {
public void send() {
System.out.println("发送邮件");
}
}
@Service
public class UserController {
private final MessageService service;
@Autowired
public UserController(MessageService service) {
this.service = service;
}
}
@Service
public class UserController {
private MessageService service;
@Autowired
public void setService(MessageService service) {
this.service = service;
}
}
@Service
public class UserController {
@Autowired
private MessageService service;
}
⚠️ 缺点:
| 方式 | 推荐度 | 特点 |
|---|---|---|
| 构造器注入 | ⭐⭐⭐⭐⭐ | 强制依赖、不可变 |
| Setter 注入 | ⭐⭐⭐ | 可选依赖 |
| 字段注入 | ⭐ | 简单但不安全 |
依赖注入 ≠ Spring
Spring 只是帮你“自动完成注入”
核心只有三步:
如果你愿意,我可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。