如何让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
相关产品推荐
相关产品推荐

