美文网首页
2.GuiceWeb服务支持

2.GuiceWeb服务支持

作者: 洛神灬殇 | 来源:发表于2022-04-05 16:52 被阅读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练习代码。

    相关文章

      网友评论

          本文标题:2.GuiceWeb服务支持

          本文链接:https://www.haomeiwen.com/subject/iiwksrtx.html