Да, @Inject
может действовать как @Autowired
... при определенных условиях.
Guice не требует Module
s, хотя они очень часто используются. Так что вы можете избавиться от них, если хотите.
Если ваш класс является конкретным классом, вы можете напрямую @Inject
его, точно так же, как @Autowired
, но вам также, вероятно, придется пометить класс @Singleton
, поскольку область действия по умолчанию в Guice - это не синглтон, а новый экземпляр всем, в отличие от весны.
Guice - это не весна, но самые важные черты одной присутствуют в другой.
Использование Guice с Tomcat
Когда вы хотите использовать Guice с Tomcat, конфигурация выполняется очень мало, но конфигурация все еще существует. Вам потребуется Module
, но только сервлет.
В вашем 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
: либо вы создаете из него интерфейс и вам нужно определить и связать реализацию, либо вы делаете из нее конкретный класс.
MyService
в качестве интерфейса
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 + "!"; }
}