`
DavyJones2010
  • 浏览: 147790 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Guice Webapp Insight

阅读更多

guice web dataflow:

Basic Design Concept:

  1) HttpRequest/HttpResponse will always be created by WebContainer(jetty/tomcat) and Guice will reuse/wrap them.

  2) For Servlet that match the url pattern in ServletModule, they will be created by Guice instead, their service() will called by guice filtering.

  3) For Servlet that doesn't match the url pattern defined in ServletModule, they will be created by WebContainer directly.

 

1) Listener:

<listener>
	<listener-class>edu.xmu.webapp.core.MyListener</listener-class>
</listener>
public class MyListener extends GuiceServletContextListener {
	@Override
	protected Injector getInjector() {
		return Guice.createInjector(new MyServletModule());
	}
}
public class MyServletModule extends ServletModule {
	@Override
	protected void configureServlets() {
		serve("*.html").with(MyServlet.class);
	}
}

2) Listener startup:

public abstract class GuiceServletContextListener
    implements ServletContextListener {
  public void contextInitialized(ServletContextEvent servletContextEvent) {
    final ServletContext servletContext = servletContextEvent.getServletContext();

    GuiceFilter.servletContext = new WeakReference<ServletContext>(servletContext);

    Injector injector = getInjector(); // will invoke our own getInjector() in listener; MyServletModule.configureServlets() will be invoked
    injector.getInstance(InternalServletModule.BackwardsCompatibleServletContextProvider.class)
        .set(servletContext);
    servletContext.setAttribute(INJECTOR_NAME, injector);
  }
}
// MyListener
@Override
protected Injector getInjector() {
	return Guice.createInjector(new MyServletModule());
}
// Guice
public static Injector createInjector(Stage stage,
   Iterable<? extends Module> modules) {
   return new InternalInjectorCreator()
     .stage(stage)
     .addModules(modules)
     .build();
}
// Elements
public static List<Element> getElements(Stage stage, Iterable<? extends Module> modules) {
  RecordingBinder binder = new RecordingBinder(stage);
  for (Module module : modules) {
    binder.install(module); // here our own module(MyServletModule) will be installed
  }
  return Collections.unmodifiableList(binder.elements);
}
// MyServletModule
@Override
protected void configureServlets() {
	serve("*.html").with(MyServlet.class);
}

3) Filter:

<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>

4) Serve Request with guice created servlet:

    Request URL:

http://localhost:8080/webapp-core/aaa.html
// GuiceFilter
public void doFilter(ServletRequest servletRequest,
    ServletResponse servletResponse, FilterChain filterChain) {
 filterPipeline.dispatch(servletRequest, servletResponse, filterChain);
}
// ManagedFilterPipeline
public void dispatch(ServletRequest request, ServletResponse response,
    FilterChain proceedingFilterChain) {
  new FilterChainInvocation(filterDefinitions, servletPipeline, proceedingFilterChain)
        .doFilter(withDispatcher(request, servletPipeline), response);
}
// FilterChainInvocation
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse){
  servletPipeline.service(servletRequest, servletResponse);
}
// ServletPipeline
public boolean service(ServletRequest request, ServletResponse response) {
  //stop at the first matching servlet and service
  for (ServletDefinition servletDefinition : servletDefinitions) {
    if (servletDefinition.service(request, response)) { // Here our own servlet is invoked
      return true;
    }
  }
  //there was no match...
  return false;
}

5) Serve Request with web container created servlet:

http://localhost:8080/webapp-core/formalServlet
<servlet>
	<servlet-name>formalServlet</servlet-name>
	<servlet-class>edu.xmu.webapp.servlet.FormalServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>formalServlet</servlet-name>
	<url-pattern>/formalServlet</url-pattern>
</servlet-mapping>
// GuiceFilter
public void doFilter(ServletRequest servletRequest,
    ServletResponse servletResponse, FilterChain filterChain) {
  filterPipeline.dispatch(servletRequest, servletResponse, filterChain);
}
// ManagedFilterPipeline
public void dispatch(ServletRequest request, ServletResponse response,
    FilterChain proceedingFilterChain) {
  new FilterChainInvocation(filterDefinitions, servletPipeline, proceedingFilterChain)
      .doFilter(withDispatcher(request, servletPipeline), response);
}
// FilterChainInvocation
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse)
      throws IOException, ServletException {
  index++;

  // Our url doesn't match any of defined guice serve url, thus serviced is false
  final boolean serviced = servletPipeline.service(servletRequest, servletResponse);

  //dispatch to the normal filter chain only if one of our servlets did not match
  if (!serviced) {
    proceedingChain.doFilter(servletRequest, servletResponse);
  }
}
// proceedingChain is an instance of "FilterChain", it will invoke all the following filters configed in web.xml, and then invoke correspond service() in target Servlet.
// From here, guice has transferred the filter/servlet control to web container(tomcat/jetty).

 

Reference Links:

1) http://insidecoding.com/2013/02/05/using-google-guice-in-web-applications/

 

分享到:
评论

相关推荐

    guice.jar/guice.jar

    guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar

    Google Guice: Agile Lightweight Dependency Injection Framework

    * What the future has in store, including Guice IDE, the next Guice version and the standardization of Guice's concepts through JSR 299. * How you can build real world, Guice-powered web ...

    guice入门学习资料

    guice 学习资料,快速掌握guice的编程技巧以及了解其机制。

    guice-3.0-API文档-中英对照版.zip

    赠送jar包:guice-3.0.jar; 赠送原API文档:guice-3.0-javadoc.jar; 赠送源代码:guice-3.0-sources.jar; 赠送Maven依赖信息文件:guice-3.0.pom; 包含翻译后的API文档:guice-3.0-javadoc-API文档-中文(简体)-...

    guice-multibindings-3.0-API文档-中文版.zip

    赠送jar包:guice-multibindings-3.0.jar; 赠送原API文档:guice-multibindings-3.0-javadoc.jar; 赠送源代码:guice-multibindings-3.0-sources.jar; 赠送Maven依赖信息文件:guice-multibindings-3.0.pom; ...

    google guice基础例子

    Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。Guice非常小而且快。Guice是类型安全的,它能够对构造函数,属性,方法(包含任意个参数的任意方法,而不仅仅是setter...

    guice-3.0-API文档-中文版.zip

    赠送jar包:guice-3.0.jar; 赠送原API文档:guice-3.0-javadoc.jar; 赠送源代码:guice-3.0-sources.jar; 赠送Maven依赖信息文件:guice-3.0.pom; 包含翻译后的API文档:guice-3.0-javadoc-API文档-中文(简体)版...

    Guice用户中文指南

    Guice用户中文指南,Guice (读作"juice")是超轻量级的,下一代的,为Java 5及后续版本设计的依赖注入容器

    Guice_1.0_Manual.pdf

    Guice开发手册, Guice中文开发手册

    guice-multibindings-3.0-API文档-中英对照版.zip

    赠送jar包:guice-multibindings-3.0.jar; 赠送原API文档:guice-multibindings-3.0-javadoc.jar; 赠送源代码:guice-multibindings-3.0-sources.jar; 赠送Maven依赖信息文件:guice-multibindings-3.0.pom; ...

    guice-4.0-API文档-中文版.zip

    赠送jar包:guice-4.0.jar; 赠送原API文档:guice-4.0-javadoc.jar; 赠送源代码:guice-4.0-sources.jar; 赠送Maven依赖信息文件:guice-4.0.pom; 包含翻译后的API文档:guice-4.0-javadoc-API文档-中文(简体)版...

    guice-2.0.jar

    guice-2.0.jar guice-2.0.jar

    google guice 3.0源码

    google guice 3.0源码,官方下载,帮助你更好理解google guice实现的原理

    guice-3.0.rar

    guice-3.0,轻量级IOC容器,包含guice-3.0.jar、guice-spring-3.0.jar、guice-struts2-plugin-3.0.jar

    guice-assistedinject-3.0-API文档-中英对照版.zip

    赠送jar包:guice-assistedinject-3.0.jar; 赠送原API文档:guice-assistedinject-3.0-javadoc.jar; 赠送源代码:guice-assistedinject-3.0-sources.jar; 赠送Maven依赖信息文件:guice-assistedinject-3.0.pom;...

    shiro,guice集成

    shiro,guice集成,官方资料,精准全面

    guice超轻量级依赖注入

    guice超轻量级依赖注入用了才知道是爽

    基于guice的简单项目

    基于guice的HelloWorld项目, 内含需要的2个jar包, 直接复制到项目里面就可以用了

    guice-4.0-API文档-中英对照版.zip

    赠送jar包:guice-4.0.jar; 赠送原API文档:guice-4.0-javadoc.jar; 赠送源代码:guice-4.0-sources.jar; 赠送Maven依赖信息文件:guice-4.0.pom; 包含翻译后的API文档:guice-4.0-javadoc-API文档-中文(简体)-...

Global site tag (gtag.js) - Google Analytics