Guice入门

最近项目用到了Guice作为轻量级的依赖注入框架,此次就把关于Guice方面的基础知识梳理了一下:
1、Guice简介
    和Spring有点类似,Guice也是个依赖注入框架,主要使用注解形式来完成依赖注入的过程,而不是像Spring一样主要使用XML(虽然也可以用注解,但是XML的配置还是作为Spring不可或缺的一部分),Guice的特点就是足够轻量级,对于一些对于性能要求(包括启动速度,运行期等等)要求比较高的应用来讲的话,使用Guice是一个很好的选择,Guice依赖的Jar包很少,对于项目的管理来讲也稍微轻松一点。缺点也有:Guice功能还不足够强,作为企业级的框架在功能上还是稍弱一些,代码的侵入性比较强,依赖关系无法像XML那么直观的描述(这个当然是对于那些习惯了XML来作为描述文件的人来讲,可能你习惯注解的方式,这个因人而异吧)。
    废话不多说,Guice搞起:
    下载Jar包 https://code.google.com/p/google-guice/,或者Maven依赖,将Guice所需的Jar包载入所使用的项目中去:
    Maven依赖示例:
< dependency >
     < groupId >com.jolira</ groupId >
     < artifactId >guice</ artifactId >
     < version >3.0.0</ version >
</ dependency >
 
先看看依赖的jar包结构:

 
这些jar包应该都不陌生,javax.inject-1.jar是满足Java依赖注入标准(JSR-330)所需的,cglib和asm都是AOP所需的Jar包,aopalliance是AOP Java接口包,OK,再加上guice的包,就这么简单。
上一个Helloworld程序,程序员惯例:
HelloWorld.java
import com.google.inject.Inject;
import com.google.inject.name.Named;
public class HelloWorld {
	@Inject @Named("hw")
	private String helloworld;

	public String getHelloworld() {
		return helloworld;
	}
}
 
HelloWorldModule.java
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;

public class HelloWorldModule extends AbstractModule{
	@Override
	protected void configure() {
		bindConstant().annotatedWith(Names.named("hw")).to("Hello,world!");
	}
}
 
HelloWorldExample.java
import com.google.inject.Guice;
import com.google.inject.Injector;

public class HelloWorldExample {
	public static void main(String[] args) {
		Injector i = Guice.createInjector(new HelloWorldModule());
		HelloWorld hw = i.getInstance(HelloWorld.class);
		System.out.println(hw.getHelloworld());
	}

}
 
2、Guice深入一点
像以上的例子中那样:
@Inject注解是告诉Guice这个地方需要注入对象进来。@Inject 可以给构造器、方法和属性注解。
Guice的注入风格:
位置 注入顺序 意图 注释
构造器 1 不变类的强制依赖 只允许一个构造器使用@Inject
属性 2 快速原型代码(无需测试) 多个属性注入顺序随机(依赖JVM)
setter方法 3 处理遗留类可选的依赖关系 多个setter方法注入顺序随机
注意:@Inject注解还有一个optional属性,默认是false,如果是true的话,就是告诉Guice假如这个地方没有绑定的话,就忽略该值。
当注入存在继承关系的时候,首先是父类先注入,然后才轮到子类,@Inject不能作为接口成员的注解,不然,你的程序貌似不怎么好使了。Guice可以给私有,包私有,保护和公有的方法或者属性注入,只要其有@Inject注解。但是给私有成员注入不是一个很好的选择。
像上面的示例代码HelloWorldExample中那样,要想开始使用Guice,首先需要创建一个Injector实例,以一个或者多个Module实现作为参数,这里是用一个工厂方法 createInjector(...)。这里还有一个Stage.DEVELOPMENT参数和Stage.PRODUCTION参数,这里就不细说了,分别在开发环境和生产环境使用。默认是开发环境,但是对性能影响不太大。
通过key来获取实例:
在Guice中所有的绑定都是基于key的绑定:
上面的:
HelloWorld hw = i.getInstance(HelloWorld.class);
等同于:HelloWorld hw = i.getInstance(Key.get(HelloWorld.class));

你可能感兴趣的:(Guice)