我有一些时间并写下了实现它的方法(仅球衣,没有使用其他 DI 框架)。
Jersey 符合 javax.inject 注释。您不使用上下文注释的原因是因为(听起来)您的 MyObject 类不是上下文对象(例如,它不会随每个请求而改变,例如可注入的 HttpServletRequest)。所以我们需要绑定你的对象。
考虑一下我对 MyObject 的实现:
public class MyObject {
String get() {
return "I am an object";
}
}
这个对象需要在我的球衣类(资源、过滤器等)中可用。我用这个 bean 写了一点资源:
@Path("context")
public class ContextResource {
@Inject
MyObject o;
@GET
public String get() {
return o.get();
}
}
请注意,我在这种情况下使用 javax.inject.Inject 注释来告诉 jersey 我想要注入这个特定的 bean。
我现在需要做的就是告诉泽西这个豆子。在我的 DW 应用程序中,我这样做:
public class Application extends io.dropwizard.Application<Configuration>{
@Override
public void run(Configuration configuration, Environment environment) throws Exception {
environment.jersey().register(ContextResource.class);
environment.jersey().register(new AbstractBinder() {
@Override
protected void configure() {
bind(MyObject.class).to(MyObject.class);
}
});
}
public static void main(String[] args) throws Exception {
new Application().run("server", "/home/artur/dev/repo/sandbox/src/main/resources/config/test.yaml");
}
}
请注意,我正在使用绑定器来绑定我的 bean。语法看起来很时髦,但本质上它是在做“将类型绑定到实现”。因为我的类型是我的实现(我没有使用 MyObject 的接口),所以看起来像:
bind(MyObject.class).to(MyObject.class)
现在 jersey 知道我的 bean 并且会很高兴地注入它。
运行我所有的代码打印:
artur@pandaadb:~/dev/vpn$ curl localhost:9085/api/context
I am an object
希望能带来一些关于如何在没有框架的情况下使用注入的见解。就我个人而言,我建议将 guice 与 dropwizard(谷歌:dropwizard-guicey)一起使用,这使得这类事情变得非常容易。
问候,
阿图尔