`
kyo100900
  • 浏览: 639808 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Guice2.0的变化——第一部分 新的特性(下)

阅读更多

 

Servlets

ServletModule 现在支持编程式的配置 servlets filters 。这些 servlets 可以直接被注入。

GuiceServletContextListener 类可以用来帮助 Guice 在一个 servlet 容器中来初始化 Guice 应用程序。同样,我也举个例子:

public class InjectedHttpServletTest extends TestCase {

  private static class MyDependency {}

  // 假设我的MyServlet依赖于MyDependency
  private static class MyServlet extends InjectedHttpServlet {
    @Inject MyDependency myDependency;
  }

  // 创建我的MyListener
  static class MyListener extends GuiceServletContextListener {
    protected Injector getInjector() {
      return Guice.createInjector();
    }
  }

  public void test() throws ServletException {

    ServletContext context = createFakeServletContext(attributes);
    ServletConfig config = createMock(ServletConfig.class);
    expect(config.getServletContext()).andReturn(context).atLeastOnce();
    replay(config);

    GuiceServletContextListener listener = new MyListener();
    listener.contextInitialized(new ServletContextEvent(context));
    assertEquals(1, attributes.size());

    MyServlet servlet = new MyServlet();
    servlet.init(config);
    verify(config);
    assertNotNull(servlet.myDependency);

    listener.contextDestroyed(new ServletContextEvent(context));
    assertTrue(attributes.isEmpty());
  }
  ...
}
 

 

Child Injectors

 

Injector.createChildInjector 允许你创建的子 injectors 继承父类的 bindings scopes interceptors converters 。该 API 的主要是为了扩展而准备的。看例子吧:

public void test() {
    Injector parent = Guice.createInjector(); //创建父Injector
Injector child = parent.createChildInjector();//创建子Injector
	//判断是否真的继承了父Injector
    assertSame(child.getInstance(A.class), parent.getInstance(A.class));

Injector anotherChild = parent.createChildInjector();//创建另一个子Injector
//判断是否继承的子Injector一致
    assertSame(anotherChild.getInstance(A.class), parent.getInstance(A.class));

Injector grandchild = child.createChildInjector();//创建一个孙子Injector
//判断是否孙子继承的Injector也一致
    assertSame(grandchild.getInstance(A.class), parent.getInstance(A.class));
  }
  ...

 

 

Even Better Error Reporting

Guice1.0 的时候,趋向于使用“又臭又长”的“ caused by ”来显示异常。现在我们已经好好的整理了这块。现在一个简单的异常就可以看出当错误发生时, Guice 的不俗表现了。

 

 

Introspection API

很像 java.lang.reflect API 允许你通过编程的方式重写一个 module ,将原来的绑定同新的绑定结合在一起。当然它还允许你查检一个已创建好的 injector ,看看里面绑定的是什么。这将会是你使用 Guice 的又一简单而又强大的扩展工具。看到这里,我马上想到了 Python 。不过,初步来看, API Doc 中貌似没有哪个类含有 Introspedtion 字眼。

 

 

Pluggable Type Converters

字符串常量绑定可以使用方便的类型转换,使之转换成任意类型(比如说转换成 dates URLs 或者 Colours

public void testOneConstantInjection() throws CreationException {
    Injector injector = Guice.createInjector(new AbstractModule() {
      protected void configure() {
        //将字符串常量“5”绑定到标注“@NumericValue”上
        bindConstant().annotatedWith(NumericValue.class).to("5");
        bind(Simple.class);
      }
    });

    Simple simple = injector.getInstance(Simple.class);
    assertEquals(5, simple.i);
  }

static class Simple {
    // 属性“i”使用了@NumericValue
    @Inject @NumericValue int i;
  }

 

 

OSGi-friendly AOP

Guice 是通过内部生成字节码的方式来实现 AOP 。在 Guice2.0 中,生成的 classes 通过一个桥接的 classloader 来装载,而这个 classloader 可以在一个类似于 OSGi 的托管环境。

 

 

Type Resolution

 

参数化的注入点( Parameterized injection points )允许你注入像 Reducer<T> Converter<A, B> 这样的类型。 Guice 会计算出 T 的实际类型,并且自动绑定上。 TypeLiteral injection 意味着你可以将一个 TypeLiteral<T> 注入到你的类中。不过要使用这个特性,还得依赖于 Java5 的泛型擦除技术。现在 TypeLiteral 类中的方法就提供了手动类型解决方案。说实话,看完下面的泛型使用,我有点头皮发麻的感觉。

public void testWildcards() throws NoSuchFieldException {
    TypeLiteral<Parameterized<String>> ofString = new TypeLiteral<Parameterized<String>>() {};

    assertEquals(new TypeLiteral<List<String>>() {}.getType(),
        ofString.getFieldType(Parameterized.class.getField("t")).getType());
    assertEquals(new TypeLiteral<List<? extends String>>() {}.getType(),
        ofString.getFieldType(Parameterized.class.getField("extendsT")).getType());
    assertEquals(new TypeLiteral<List<? super String>>() {}.getType(),
        ofString.getFieldType(Parameterized.class.getField("superT")).getType());
  }

  static class Parameterized<T> {
    public List<T> t;
    public List<? extends T> extendsT;
    public List<? super T> superT;
  }

...

 

 

 

 

第一部分结束..........

11
1
分享到:
评论

相关推荐

    guice-2.0.jar

    guice-2.0.jar guice-2.0.jar

    struts2+ibatis3+guice2.0使用完整例子

    采用的框架是struts2.1.8,ibatis3,guice2.0,完整的产品模块和权限模块(部分功能)例子。这是smeite.com商城第一版本的部分代码,测试通过。 希望给需要的朋友一个借鉴。 自我认为是学习Ibatis3比较好的例子,覆盖...

    Guice2.0+Hibernate3.2+warp-persist-2.0+Struts2+JPA

    轻量级的Guice2.0代替了Spring,速度更快,项目体积更小,Hibernate3.2与JPA的结合使用代替了传统的配置文件,使Hibernate的开发更简单,本项目基本上是零配置开发,由于我只能上传小于15M的文件,故JAR被我删除了,...

    Robojuice jar 包文件下载(内含guice-2.0-no_aop.jar 和roboguice-1.1.2.jar )

    `guice-2.0-no_aop.jar`是Guice的一个版本,不包含Aspect Oriented Programming(AOP)支持,这可能是因为在Android环境中,AOP的使用可能会增加复杂性和性能开销。 接下来,我们来看RoboGuice。RoboGuice是Guice的...

    guice-2.0-no_aop.jar

    guice-2.0-no_aop.jar

    基于guice的简单项目

    这些库提供了Guice的基本功能和扩展特性,如Assisted Injection,用于创建具有部分构造函数参数的复杂对象。 总结来说,这个基于Guice的HelloWorld项目旨在演示如何使用Guice框架进行依赖注入,以实现代码的松耦合...

    goole-guice所有JAR包

    Guice-2.0版本是Guice框架的一个早期版本,相比于现在的4.x版本,可能缺少一些特性,比如更多的范围选项、更完善的异常处理等。但是,即便是早期版本,Guice-2.0也已经提供了基本的依赖注入功能,足够应对许多中小...

    java guice dependency injection tutorial

    ### Java Guice 依赖注入教程 #### 概述 本文档详细介绍如何利用 Google 开源的依赖注入框架 Guice 进行 Java 开发...随着 Guice 2.0 的推出,开发者将能够体验到更多的新功能和改进,进一步提升开发效率和代码质量。

    guice.jar/guice.jar

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

    guice-2.0-no_aop.jar中文-英文对照文档.zip

    (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...

    Google Guice: Agile Lightweight Dependency Injection Framework

    - **现代化**:Guice充分拥抱了Java语言的新特性,如注解驱动的依赖注入。 - **适用场景**: - **Web应用开发**:可以与Struts 2或Wicket等流行框架结合使用。 - **企业级应用**:适用于大型、复杂的系统。 - *...

    guice入门教程helloworld篇

    Guice,全称为Google Guice,是一款轻量级的依赖注入框架,由Google开发并开源。依赖注入(Dependency Injection,DI)是一种设计模式,它帮助我们解耦代码,提高组件的可测试性和可维护性。Guice通过在运行时自动...

    Guice用户中文指南

    5. **强大的社区支持**:由于其开源特性,Guice拥有一个活跃的社区,提供了丰富的资源和支持。 #### 三、示例解析 在给定的部分内容中,首先介绍了一个简单的服务接口`Service`及其两个实现类:`ServiceImpl`和`...

    Guice 中文文档 例子

    依赖注入(Dependency Injection,简称 DI)是一种设计模式,它允许开发者在不直接创建对象的情况下,将依赖关系从代码中解耦出来,从而提高代码的可测试性和可维护性。Guice 提供了一种简洁、类型安全的方式来管理...

    google guice 3.0源码

    Guice 3.0是其一个重要的版本,提供了许多改进和新特性。 在Guice 3.0源码中,我们可以深入学习以下几个关键知识点: 1. **依赖注入(Dependency Injection)**:Guice的核心概念是依赖注入,它允许我们声明所需的...

    shiro,guice集成

    这种集成允许开发者利用 Guice 的强大特性来配置和管理 Shiro 组件,从而简化了安全层的实现。集成的主要目标是通过标准的 Guice 规范和机制来设置 Shiro 的核心组件,如 SecurityManager、Realm 等,并且支持 Web ...

    mybatis-guice-3.6.zip

    MyBatis-Guice 3.6 是一个集成框架,它是MyBatis——一个流行的Java持久层框架——与Google的Guice依赖注入框架的完美结合。这个版本的MyBatis-Guice旨在简化MyBatis的配置过程,通过Guice的自动装配特性,帮助...

    jersey2.15集成guice笔记

    在Java Web开发中,Jersey是一个流行的RESTful服务实现框架,而Guice是Google提供的一个轻量级依赖注入(DI)容器。这篇笔记将深入探讨如何将这两个强大的工具集成为一体,以优化项目架构和提高代码可维护性。 **一...

    DI容器框架Google Guice与Spring框架的区别

    这个标题表明我们要探讨的是两种不同的依赖注入(Dependency Injection,简称DI)容器——Google Guice和Spring框架之间的差异。DI是一种设计模式,它帮助开发者在对象之间解耦,使得代码更加灵活、可测试和可维护。...

Global site tag (gtag.js) - Google Analytics