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;
}
...
第一部分结束..........
分享到:
相关推荐
guice-2.0.jar guice-2.0.jar
采用的框架是struts2.1.8,ibatis3,guice2.0,完整的产品模块和权限模块(部分功能)例子。这是smeite.com商城第一版本的部分代码,测试通过。 希望给需要的朋友一个借鉴。 自我认为是学习Ibatis3比较好的例子,覆盖...
轻量级的Guice2.0代替了Spring,速度更快,项目体积更小,Hibernate3.2与JPA的结合使用代替了传统的配置文件,使Hibernate的开发更简单,本项目基本上是零配置开发,由于我只能上传小于15M的文件,故JAR被我删除了,...
`guice-2.0-no_aop.jar`是Guice的一个版本,不包含Aspect Oriented Programming(AOP)支持,这可能是因为在Android环境中,AOP的使用可能会增加复杂性和性能开销。 接下来,我们来看RoboGuice。RoboGuice是Guice的...
guice-2.0-no_aop.jar
这些库提供了Guice的基本功能和扩展特性,如Assisted Injection,用于创建具有部分构造函数参数的复杂对象。 总结来说,这个基于Guice的HelloWorld项目旨在演示如何使用Guice框架进行依赖注入,以实现代码的松耦合...
Guice-2.0版本是Guice框架的一个早期版本,相比于现在的4.x版本,可能缺少一些特性,比如更多的范围选项、更完善的异常处理等。但是,即便是早期版本,Guice-2.0也已经提供了基本的依赖注入功能,足够应对许多中小...
### Java Guice 依赖注入教程 #### 概述 本文档详细介绍如何利用 Google 开源的依赖注入框架 Guice 进行 Java 开发...随着 Guice 2.0 的推出,开发者将能够体验到更多的新功能和改进,进一步提升开发效率和代码质量。
guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar guice.jar
(1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以...
- **现代化**:Guice充分拥抱了Java语言的新特性,如注解驱动的依赖注入。 - **适用场景**: - **Web应用开发**:可以与Struts 2或Wicket等流行框架结合使用。 - **企业级应用**:适用于大型、复杂的系统。 - *...
Guice,全称为Google Guice,是一款轻量级的依赖注入框架,由Google开发并开源。依赖注入(Dependency Injection,DI)是一种设计模式,它帮助我们解耦代码,提高组件的可测试性和可维护性。Guice通过在运行时自动...
5. **强大的社区支持**:由于其开源特性,Guice拥有一个活跃的社区,提供了丰富的资源和支持。 #### 三、示例解析 在给定的部分内容中,首先介绍了一个简单的服务接口`Service`及其两个实现类:`ServiceImpl`和`...
依赖注入(Dependency Injection,简称 DI)是一种设计模式,它允许开发者在不直接创建对象的情况下,将依赖关系从代码中解耦出来,从而提高代码的可测试性和可维护性。Guice 提供了一种简洁、类型安全的方式来管理...
Guice 3.0是其一个重要的版本,提供了许多改进和新特性。 在Guice 3.0源码中,我们可以深入学习以下几个关键知识点: 1. **依赖注入(Dependency Injection)**:Guice的核心概念是依赖注入,它允许我们声明所需的...
1. **定义接口**:首先定义一个`Service`接口,代表一种通用的服务功能。 2. **实现接口**:接着,实现`Service`接口的两个版本——`ServiceImpl`作为默认实现,`MockService`用于单元测试。 3. **传统工厂模式...
这种集成允许开发者利用 Guice 的强大特性来配置和管理 Shiro 组件,从而简化了安全层的实现。集成的主要目标是通过标准的 Guice 规范和机制来设置 Shiro 的核心组件,如 SecurityManager、Realm 等,并且支持 Web ...
MyBatis-Guice 3.6 是一个集成框架,它是MyBatis——一个流行的Java持久层框架——与Google的Guice依赖注入框架的完美结合。这个版本的MyBatis-Guice旨在简化MyBatis的配置过程,通过Guice的自动装配特性,帮助...
在Java Web开发中,Jersey是一个流行的RESTful服务实现框架,而Guice是Google提供的一个轻量级依赖注入(DI)容器。这篇笔记将深入探讨如何将这两个强大的工具集成为一体,以优化项目架构和提高代码可维护性。 **一...
这个标题表明我们要探讨的是两种不同的依赖注入(Dependency Injection,简称DI)容器——Google Guice和Spring框架之间的差异。DI是一种设计模式,它帮助开发者在对象之间解耦,使得代码更加灵活、可测试和可维护。...