gpt4 book ai didi

java - Guice - Guice 中的 Spring Autowired 相当于什么

转载 作者:行者123 更新时间:2023-11-30 02:00:20 27 4
gpt4 key购买 nike

我正在尝试使用 Guice,并且我来自 Spring。

我想知道 @Inject 是否相当于 Spring 中的 @Autowired 以及我是否可以在 Web 应用程序中使用它,就像在 Spring 中使用它一样。

假设我有一个依赖于服务的 Facade,在 Spring 中我可以为该服务定义一个 bean,然后当服务器启动时我可以在我的 Facade 中获取该服务的实例。

class FacadeImpl{
@Autowire Service service;
...
}

假设服务有一个具体的实现,并且在 Spring 中会自动注入(inject)它。

Guice 有类似的方法吗?我可以做类似的事情

class Facade{
@Inject Service service;
}

还是只有 Spring 才有的魔法?

在我的网络应用程序中,我开始嵌入 tomcat 并以这种方式使用 google guice 模块

Guice.createInjector(new ConfigurationModule());

希望这足以“注入(inject)”用 @Inject 注释的任何内容。

但是,它不起作用(我并不感到惊讶)。你们能帮我找出哪些 BP 可以在我的 Servlet 或 Facades 等上注入(inject)依赖项吗?

最佳答案

是的,@Inject可以充当 @Autowired ...给定一些条件。

Guice 不需要 Module s,尽管它们经常被使用。因此,如果您愿意,您可以摆脱它们。

如果你的类是具体类,可以直接@Inject它,就像 @Autowired ,但您可能还必须标记该类 @Singleton因为 Guice 中的默认范围不是单例,而是每个人一个新实例,这与 Spring 不同。

Guice 不是 Spring,但其中一个最重要的功能存在于另一个中。

将 Guice 与 Tomcat 结合使用

当你想将Guice与Tomcat一起使用时,需要做的配置很少,但仍然有配置。您将需要 Module ,但仅限 servlet。

在你的 web.xml ,添加以下内容:

<listener>
<listener-class>path.to.MyGuiceServletConfig</listener-class>
</listener>

<filter>
<filter-name>guiceFilter</filter-name>
<filter-class>com.google.inject.servlet.GuiceFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>guiceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<强> MyGuiceServletConfig.java

public class MyGuiceServletConfig extends GuiceServletContextListener {
@Override protected Injector getInjector() {
return Guice.createInjector(new ServletModule() {
@Override protected void configureServlets() {
serve("/*").with(MyServlet.class); // Nothing else is needed.
}
});
}
}

<强> MyServlet.java

public class MyServlet extends HttpServlet {

@Inject // Similar to @Autowired
private MyService myService;

@Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
resp.getWriter().write(myService.hello("Guice"));
}
}

现在您可以选择MyService :要么用它创建一个接口(interface),然后必须定义并绑定(bind)一个实现,要么用它创建一个具体的类。

MyService作为接口(interface)

<强> MyService.java

@ImplementedBy(MyServiceImpl.class) // This says "hey Guice, the default implementation is MyServiceImpl."
public interface MyService {
String hello(String name);
}

<强> MyServiceImpl.java

@Singleton // Use the same default scope as Spring
public class MyServiceImpl implements MyService {
// @Inject dependencies as you wish.
public String hello(String name) { return "Hello, " + name + "!"; }
}

如果您想避免 @ImplementedBy ,您仍然可以使用上面的模块,并添加 bind(MyService.class).to(MyServiceImpl.class).in(Scopes.SINGLETON); ,或者在同一个 Module 中编写一个提供者方法:

@Provides @Singleton MyService provideMyService() {
return new MyServiceImpl();
}

MyService作为一个具体的类

<强> MyService.java

@Singleton // Use the same default scope as Spring
public class MyService {
// @Inject dependencies as you wish.
public String hello(String name) { return "Hello, " + name + "!"; }
}

关于java - Guice - Guice 中的 Spring Autowired 相当于什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53090222/

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