温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java依赖注入如何实现

发布时间:2026-10-05 17:17:14 来源:亿速云 阅读:86 作者:小樊 栏目:编程语言

在 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;
    }
}

✅ 好处:

  • 解耦
  • 易测试(可注入 Mock)
  • 易维护、易扩展

二、Java 中实现依赖注入的 3 种方式

1️⃣ 构造器注入(推荐)

class UserService {
    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

使用:

UserDao dao = new UserDao();
UserService service = new UserService(dao);

✅ 优点:

  • 依赖不可变(final)
  • 强制依赖清晰
  • Spring 官方推荐

2️⃣ Setter 注入

class UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

使用:

UserService service = new UserService();
service.setUserDao(new UserDao());

✅ 适合:

  • 可选依赖
  • 运行时可更换实现

3️⃣ 字段注入(不推荐手写)

class UserService {
    @Autowired
    private UserDao userDao;
}

⚠️ 问题:

  • 隐藏依赖
  • 不利于测试
  • 只能在容器中用

三、自己手写一个简单的“依赖注入容器”

1️⃣ 定义注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Inject {}

2️⃣ 使用注解

class UserService {
    @Inject
    private UserDao userDao;
}

3️⃣ 简易注入逻辑

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());
        }
    }
}

四、Spring 中的依赖注入(最常用)

1️⃣ 使用 @Component + @Autowired

@Component
class UserDao {}

@Component
class UserService {
    @Autowired
    private UserDao userDao;
}

2️⃣ 构造器注入(Spring 推荐)

@Service
public class UserService {
    private final UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }
}

3️⃣ Spring 注入方式总结

方式 注解 推荐度
构造器 无 / @Autowired ⭐⭐⭐⭐⭐
Setter @Autowired ⭐⭐⭐
字段 @Autowired ❌

五、依赖注入 vs 依赖查找

对比 依赖注入(DI) 依赖查找(DL)
谁找依赖 容器 自己
代码耦合 低 高
示例 @Autowired context.getBean()

六、常见面试回答模板

依赖注入是将对象所依赖的组件由外部容器在运行时传入,而不是由对象自己创建。
Java 中可以通过构造器、Setter 或反射实现;
Spring 中常用 @Autowired 配合 @Component、@Service 等注解完成自动装配,推荐构造器注入。


如果你愿意,我也可以:

  • 用 Spring Boot 示例演示
  • 讲 循环依赖怎么解决
  • 对比 Java vs Go 的 DI 思想

你想深入哪一块?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手