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

如何让Jersey与Dagger 2依赖注入框架协同工作?

嘿,这个需求完全可行!既然Dagger 2和HK2都实现了JSR 330规范,我们只需要搭建一个简单的桥接层,就能让Jersey用上Dagger的依赖注入能力。下面是适配你SE环境下Grizzly-Jersey服务器的具体实现步骤:

1. 实现Jersey的Injector接口,桥接Dagger 2

Jersey的依赖注入核心是org.glassfish.jersey.inject.spi.Injector接口,我们需要写一个实现类,把所有注入请求转发给Dagger的组件:

import org.glassfish.jersey.inject.spi.Injector;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.lang.reflect.Type;

@Singleton
public class DaggerInjector implements Injector {

    private final YourDaggerComponent daggerComponent;

    @Inject
    public DaggerInjector(YourDaggerComponent daggerComponent) {
        this.daggerComponent = daggerComponent;
    }

    @Override
    public <T> T getInstance(Class<T> clazz) {
        return daggerComponent.get(clazz);
    }

    @Override
    public <T> T getInstance(Type type) {
        // 如果需要处理泛型依赖,可以在这里扩展(比如用Guava的TypeToken)
        return (T) daggerComponent.get((Class<?>) type);
    }
}

注:YourDaggerComponent是你自己定义的Dagger组件,要确保它能提供所有Jersey需要注入的类的实例。

2. 注册自定义Injector到Jersey配置

接下来要告诉Jersey放弃默认的HK2,改用我们的DaggerInjector。我们通过ResourceConfig来注册一个InjectorProvider:

import org.glassfish.jersey.inject.spi.Injector;
import org.glassfish.jersey.inject.spi.InjectorProvider;
import org.glassfish.jersey.server.ResourceConfig;
import javax.inject.Singleton;

public class DaggerJerseyConfig extends ResourceConfig {

    public DaggerJerseyConfig(YourDaggerComponent daggerComponent) {
        // 注册你的Jersey资源类、过滤器、拦截器等
        register(UserResource.class);
        register(AuthFilter.class);

        // 注册Dagger注入器提供者
        register(new InjectorProvider() {
            @Override
            public Injector getInjector() {
                return new DaggerInjector(daggerComponent);
            }
        }, Singleton.class);
    }
}
3. 启动Grizzly服务器时传入Dagger组件

在启动代码里,先初始化Dagger组件,再把它传给我们的自定义Jersey配置:

import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import java.net.URI;

public class ApplicationStarter {
    public static void main(String[] args) {
        // 初始化Dagger组件(根据你的Module配置调整)
        YourDaggerComponent daggerComponent = DaggerYourDaggerComponent.create();

        // 创建绑定了Dagger的Jersey配置
        DaggerJerseyConfig jerseyConfig = new DaggerJerseyConfig(daggerComponent);

        // 启动Grizzly服务器
        URI baseUri = URI.create("http://localhost:8080/api/");
        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(baseUri, jerseyConfig);

        // 添加关闭钩子,优雅停止服务器
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            server.shutdownNow();
            System.out.println("服务器已停止");
        }));

        System.out.println("服务器启动成功,访问地址:" + baseUri);
    }
}
额外注意事项
  • 确保你的Dagger @Module里正确绑定了所有需要注入的类,或者使用Dagger支持的构造注入(类带有@Inject构造方法)。
  • 尽量只使用JSR330规范的注解(@Inject、@Singleton、@Named),避免HK2特有的注解,这样能保证完全兼容。
  • 如果需要处理泛型依赖,你可以扩展getInstance(Type type)方法,比如借助Guava的TypeToken来匹配Dagger的泛型绑定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:59:48