在 Java 中,**依赖注入(Dependency Injection,DI)**是一种设计思想,用来解耦对象之间的依赖关系。核心目标是:对象不自己创建依赖,而是由外部(容器或调用者)把依赖“注入”进来。
下面从 概念 → 手写实现 → 框架实现(Spring)→ 常见方式 逐步说明。
不用 DI 的写法(紧耦合)
class Service {
private Dao dao = new Dao(); // 自己创建依赖
}
使用 DI 的写法
class Service {
private Dao dao;
// 依赖由外部传入
public Service(Dao dao) {
this.dao = dao;
}
}
✅ 好处:
class UserService {
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
使用:
UserDao dao = new UserDao();
UserService service = new UserService(dao);
✅ 优点:
class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
使用:
UserService service = new UserService();
service.setUserDao(new UserDao());
✅ 适合:
class UserService {
@Autowired
private UserDao userDao;
}
⚠️ 问题:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Inject {}
class UserService {
@Inject
private UserDao userDao;
}
public static void inject(Object obj) throws Exception {
for (Field field : obj.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(Inject.class)) {
field.setAccessible(true);
field.set(obj, new UserDao());
}
}
}
@Component + @Autowired@Component
class UserDao {}
@Component
class UserService {
@Autowired
private UserDao userDao;
}
@Service
public class UserService {
private final UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
| 方式 | 注解 | 推荐度 |
|---|---|---|
| 构造器 | 无 / @Autowired | ⭐⭐⭐⭐⭐ |
| Setter | @Autowired | ⭐⭐⭐ |
| 字段 | @Autowired | ❌ |
| 对比 | 依赖注入(DI) | 依赖查找(DL) |
|---|---|---|
| 谁找依赖 | 容器 | 自己 |
| 代码耦合 | 低 | 高 |
| 示例 | @Autowired |
context.getBean() |
依赖注入是将对象所依赖的组件由外部容器在运行时传入,而不是由对象自己创建。
Java 中可以通过构造器、Setter 或反射实现;
Spring 中常用@Autowired配合@Component、@Service等注解完成自动装配,推荐构造器注入。
如果你愿意,我也可以:
你想深入哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。