gpt4 book ai didi

java - 如何将对象设置为上下文,以便我可以使用 @Context 在应用程序中的任何位置获取它

转载 作者:行者123 更新时间:2023-11-30 07:12:33 26 4
gpt4 key购买 nike

我想将 MyObject 类实例设置为应用程序上下文,以便我可以通过以下方式在任何地方使用它:

@Context MyObject 对象

我使用了 Jedis,它让我可以通过上述方法访问 jedis

请帮助设置上下文。

我正在使用dropwizard(jetty、jersery 和 jackson)

最佳答案

我花了一些时间写下了实现它的方法(仅 jersey,没有使用其他 DI 框架)。

Jersey 符合 javax.inject 注释。您不使用上下文注释的原因是因为(从它的声音来看)您的 MyObject 类不是上下文对象(例如,它不会随着每个请求而变化,例如可注入(inject)的 HttpServletRequest)。所以我们需要绑定(bind)你的对象。

考虑我的 MyObject 实现:

public class MyObject {

String get() {
return "I am an object";
}
}

该对象需要在我的 Jersey 类(资源、过滤器等)中可用。我使用这个 bean 编写了一些资源:

@Path("context")
public class ContextResource {

@Inject
MyObject o;

@GET
public String get() {
return o.get();
}

}

请注意,在本例中我使用 javax.inject.Inject 注释来告诉 jersey 我想要注入(inject)这个特定的 bean。我现在要做的就是告诉 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");
}
}

请注意,我使用 Binder 来绑定(bind)我的 bean。该语法看起来很时髦,但本质上它是在执行“将类型绑定(bind)到实现”。由于我的类型是我的实现(我没有使用 MyObject 的接口(interface)),因此看起来像:

bind(MyObject.class).to(MyObject.class) 

现在 jersey 知道了我的 bean 并且会很高兴地注入(inject)它。

运行我的所有代码打印:

artur@pandaadb:~/dev/vpn$ curl localhost:9085/api/context
I am an object

希望这能带来一些关于如何在没有框架的情况下使用注入(inject)的见解。就我个人而言,我建议将 guice 与 dropwizard (谷歌:dropwizard-guicey)一起使用,这使得这些事情变得非常容易。

问候,

阿图尔

关于java - 如何将对象设置为上下文,以便我可以使用 @Context 在应用程序中的任何位置获取它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com