You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Java中可注入的构造函数传递参数?

如何用JSR330的@Inject实现构造函数依赖注入

兄弟,我太懂你手动DI越搞越乱的痛苦了!当依赖链一层层变长的时候,手动new简直是噩梦——你得盯着每个依赖的依赖去创建,稍不留神就漏了或者写错。用JSR330的@Inject来搞定构造函数注入其实很简单,我给你一步步拆解:

1. 给目标类的构造函数标记@Inject

首先,给你的MyClass构造函数加上@Inject注解,告诉DI容器:“就用这个构造器来创建实例,帮我搞定里面的依赖!”

import javax.inject.Inject;

public class MyClass {
    private final DepA depA;
    private final DepB depB;

    // 用@Inject标记构造函数,明确这是容器要使用的注入入口
    @Inject
    public MyClass(DepA depA, DepB depB) {
        this.depA = depA;
        this.depB = depB;
    }
}

2. 处理依赖类的注入(递归解决深层依赖)

如果你的DepA、DepB本身也有依赖,比如DepA依赖DepC,同样给它们的构造函数加上@Inject就行——DI容器会自动递归处理整个依赖链:

import javax.inject.Inject;

// DepA有自己的依赖DepC
public class DepA {
    private final DepC depC;

    @Inject
    public DepA(DepC depC) {
        this.depC = depC;
    }
}

// 无依赖的类,加@Inject无参构造更明确(不加也可以,容器默认识别无参构造)
public class DepC {
    @Inject
    public DepC() {}
}

// DepB同理,如果有依赖就加@Inject构造,没有的话用无参构造即可
public class DepB {
    @Inject
    public DepB() {}
}

这时候容器会帮你完成整个依赖链的创建:先创建DepC → 再创建DepA → 创建DepB → 最后组装出MyClass,完全不用你手动一层层写new!

3. 从DI容器获取实例

接下来你需要一个兼容JSR330的DI容器(比如Guice、CDI、Spring都支持),拿Guice举个简单例子:

首先创建一个模块(用来告诉容器类的绑定规则,大部分具体类不需要额外绑定,容器会自动识别):

import com.google.inject.AbstractModule;

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        // 如果是接口依赖,才需要绑定到实现类,比如:
        // bind(MyInterface.class).to(MyInterfaceImpl.class);
        // 具体类像DepA、DepB这种,不需要额外配置
    }
}

然后创建容器并获取MyClass实例:

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {
    public static void main(String[] args) {
        // 初始化DI容器
        Injector injector = Guice.createInjector(new MyModule());
        
        // 直接获取MyClass实例,容器自动处理所有依赖
        MyClass myClass = injector.getInstance(MyClass.class);
    }
}

几个关键注意点

  • 一个类只能有一个标记了@Inject的构造函数,容器会优先使用这个构造器。
  • 如果类只有无参构造,加不加@Inject都可以(容器默认会使用无参构造,除非你标记了带参数的@Inject构造)。
  • 对于接口类型的依赖,必须在容器模块里绑定接口到具体实现类,否则容器不知道该注入哪个实例。

这种方式的核心优势就是把对象创建的逻辑从业务代码中抽离,依赖链越长越能体现价值——你再也不用关心底层依赖怎么创建,只需要告诉容器“我需要这个类的实例”,剩下的交给容器就行!

内容的提问来源于stack exchange,提问作者Cithel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:47:12