Servlet集成
Guice也可以和Servlet项目集成,这样我们就可以不用编写冗长的web.xml,以依赖注入的方式使用Servlet和相关组件。
安装Guice Servlet扩展
要在Servlet项目中集成Guice,首先需要安装Guice Servlet扩展。如果使用Maven,添加下面的依赖。
<dependency>
<groupId>com.google.inject.extensions</groupId> <artifactId>guice-servlet</artifactId> <version>4.1.0</version>
</dependency>
添加依赖之后,在web.xml中添加下面的代码,让Guice过滤所有web请求。
<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>
配置Injector
和普通的项目一样,Servlet项目同样需要配置Injector。一种比较好的办法就是在ContextListener中配置Injector。Guice的Servlet集成提供了GuiceServletContextListener,我们继承该类并在getInjector方法中配置Injector即可。
public class MyGuiceServletConfigListener extends GuiceServletContextListener {
@Override
protected Injector getInjector() {
return Guice.createInjector(new ServletModule());
}
}
当然仅仅继承GuiceServletContextListener还是不够的。我们还需要在web.xml中添加几行代码。
<listener>
<listener-class>yitian.study.servlet.MyGuiceConfigListener</listener-class>
</listener>
配置Servlet和过滤器
默认的ServletModule就会启用一些功能。如果需要自定义Servlet和Filter,就需要继承ServletModule并重写configureServlets()方法。配置Servlet和Filter的方法和配置普通依赖注入类似。
public class MyServletConfig extends ServletModule {
@Override protected void configureServlets() { serve("/*").with(MainServlet.class); filter("/*").through(CharEncodingFilter.class); }
}
然后将ServletModule替换为我们自己的实现类。
public class MyGuiceConfigListener extends GuiceServletContextListener {
@Override protected Injector getInjector() { return Guice.createInjector(new MyServletConfig()); }
}
注入Servlet相关对象
除了配置Servlet之外,Guice还允许我们把Request、Response和Session对象注入到非Servlet对象中。下面是Guice的一个例子。
@RequestScoped
class SomeNonServletPojo {
@Inject
SomeNonServletPojo(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
...
}
}
我们还可以使用Guice注入请求参数。下面这个类的作用是获取所有请求参数并转换为字符串形式。
@RequestScoped
public class Information {
@Inject @RequestParameters Map<String, String[]> params; public String getAllParameters() { return params.entrySet() .stream() .map(entry -> entry.getKey() + " : " + Arrays.toString(entry.getValue())) .collect(Collectors.joining(", ")); }
}
之后,我们就可以将该对象注入到Servlet中使用,将结果返回给页面。
@Singleton
public class MainServlet extends HttpServlet {
@Inject private Injector injector; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String name = req.getParameter("name"); req.setAttribute("name", name); Information info = injector.getInstance(Information.class); req.setAttribute("params", info.getAllParameters()); req.getRequestDispatcher("index.jsp").forward(req, resp); } @Override public void init() throws ServletException { super.init(); }
}
Guice Servlet扩展还有其他功能,这里就不在列举了。详情请参看Guice文档。
JSR-330标准
JSR-330是一项Java EE标准,指定了Java的依赖注入标准。Spring、Guice和Weld等很多框架都支持JSR-330。下面这个表格来自于Guice文档,我们可以看到JSR-330和Guice注解基本上可以互换。
image
Provider Provider Guice的Provider继承了JSR-330的Provider
Guice官方推荐我们首选JSR-330标准的注解。
以上就是Guice的基本知识了。如果需要更详细的使用方法,请参考Guice文档。如果有兴趣还可以看看我的CSDN代码,包含了我的Guice练习代码。
网友评论