2.GuiceWeb服务支持

2022-04-05  本文已影响0人  洛神灬殇

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练习代码。

上一篇下一篇

猜你喜欢

热点阅读