该帖已经被评为隐藏帖
|
|||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | ||||||||||||||||||||||||||||||||||||
发表时间:2008-03-12
依赖注入,DI(Dependency Injection),它的作用自然不必多说,提及DI容器,例如spring,picoContainer,EJB容器等等,近日,google诞生了更轻巧的DI容器……Guice! public interface MyService ...{ void myMethod(); } public class MyServiceImpl implements MyService ...{ public void myMethod() ...{ System.out.println("Hello,World!"); } } 以上是最普通的接口和其实现,没什么可说的。 定义一个测试类,这个类里边包括service对象的一个引用,这个对象是需要Guice进行注入的 import com.google.inject.Inject; public class Client ...{ MyService service; @Inject //告诉容器,这里的service对象的引用,需要进行注入 void setService(MyService service) ...{ //这里的方法名字可以任意定义 this.service = service; } public void myMethod() ...{ service.myMethod(); } } 这里除了加了一个@Inject,和Spring的配置没有任何的区别,@Inject,是表示对容器说,这里的service需要注射,等到运行的时候,容器会拿来一个实例给service,完成注射的过程。 定义Guice的Module文件 告诉容器如何进行注入 import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.Scopes; public class MyModule implements Module ...{ public void configure(Binder binder) ...{ binder.bind(MyService.class).to(MyServiceImpl.class).in(Scopes.SINGLETON); // 这句代码的意思是说:运行时动态的将MyServiceImpl对象赋给MyService定义的对象,而且这个对象是单例的。 } } 创建测试类 import com.google.inject.Guice; import com.google.inject.Injector; public class Test ...{ public static void main(String[] args) ...{ MyModule module = new MyModule();// 定义注射规则 Injector injector = Guice.createInjector(module);// 根据注射规则,生成注射者 Client client = new Client(); injector.injectMembers(client);// 注射者将需要注射的bean,按照规则,把client这个客户端进行注射 client.myMethod(); } } 运行测试类,控制台输出:Hello,World! 完成注入过程 下面看看Guice还有哪些其它的使用特性。 1,如果在实现你确定MyService定义的对象,就要被注射为MyServiceImpl而不是其它的实现类的话,可以在MyService接口加上@ImplementedBy(MyServiceImpl.class) import com.google.inject.ImplementedBy; @ImplementedBy(MyServiceImpl.class) //我总觉得这样有点背离了依赖注入的初衷了 public interface MyService ...{ void myMethod(); } 这样的话,在MyModule里的configure方法中就可以不加任何东西,容器就会自动注射给MyServiceImpl对象。 2,可以对Field进行注解式注入 在Client.java中也可以把这个@Inject标注在MyService service;的前边,如:@Inject MyService service; 3,可使用自定义Annotation标注。 package mypackage; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import com.google.inject.BindingAnnotation; @Retention(RetentionPolicy.RUNTIME) @Target( ...{ ElementType.FIELD, ElementType.PARAMETER }) @BindingAnnotation public @interface MyInterface ...{ } 那么Client.java需要改为 package mypackage; import com.google.inject.Inject; public class Client ...{ @Inject @MyInterface MyService service; void setService(MyService service) ...{ // 这里的方法名字可以任意定义 this.service = service; } public void myMethod() ...{ service.myMethod(); } }
原文:http://java.chinaitlab.com/Spring/719816.html
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||
发表时间:2008-03-12
Guice和JavaConfig:使用Annotation进行反转控制的两种方式作者 Rob Thornton译者 Jason Lai 发布于 2007年3月27日 下午3时30分 随着 Guice 的最初发行版慢慢尘埃落定,将它和 Spring IoC,尤其是和 Spring JavaConfig 进行的比较也随之浮出水面。Guice 和 JavaConfig 采取了两种不同的方式使用 Java Annotations 将 IoC 配置放入代码。 目前 Spring JavaConfig 发布了 1.0 Milestone 1 版本,它和 Guice 的基本想法是一致的——把配置从 XML 移至 Annotation 是一种更好的做法,因为这样使得配置信息与代码更为紧密。Tapestry 的 IoC 容器也是根据同样的想法设计的。 JavaConfig 和 Guice 的背景极其相似。事实上,Bob Lee 是这样叙述它们的历史的: 此外,我还想说一个有点意思的小故事:Guice 最开始的时候和 Spring JavaConfig 看起来非常像——这并不奇怪,因为 Rod 一年前向我展示了 Spring JavaConfig(而六个月前我又让他看了 Guice)。正如使用 JavaConfig 一样,你得显式地写 Java 代码来连接你的对象。我从一开始就引入 @Inject 做为检查外部代码按照你的安排调用所有的 setters 的一种可选方式。而自打我们有了 @Inject,我开始问,我们为什么还需要显式地编写对象连接代码呢?于是很快我们就有大家今天所知道的 Guice。 关于 Guice 和 JavaConfig 区别的帖子有不少。Debasish Ghosh 恰如其分地总结到:
在这些文章的回帖中,你可以发现,在这两个框架之间做选择的时候,最值得注意的就是它们设计哲学的区别。你会希望依赖注入和代码靠得有多近呢?如果使用 Guice,你的代码将和容器紧密耦合在一起,这样做有些人喜欢,有些人反感。Guice 号称自己的速度更快,但值得注意的是,Spring IoC 容器(不管是 JavaConfig 还是其它)支持多种钩子,而 Guice 并没有提供。Spring 为大家带来的不仅仅是 IoC,而 Guice 并不打算解决那些大问题。 |
|||||||||||||||||||||||||||||||||||||
返回顶楼 | |||||||||||||||||||||||||||||||||||||
浏览 1593 次