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(); } }
MyModule.java中的configure方法内容需改为:
binder.bind(MyService.class).annotatedWith(MyInterface.class).to( MyServiceImpl.class).in(Scopes.SINGLETON); 意思是说对于标注为MyInterface的MyService定义的对象进行注入
进行Annotation标注的成员(Field,method,argument等)进行自定义Annotation标注,该成员既拥有该属性,可以在运行,根据这些成员的不同属性,做一些不同的事情 例如:spring的AspectJ,xdoclet等都是如此。
下边是我做了一下对比 Guice与Spring的对比 Spring Guice 使用XML 使用将类与类之间的关系隔离到xml中,由容器负责注入被调用的对象,因此叫做依赖注入不使用xml,将类与类之间的关系隔离到Module中,声名何处需要注入,由容器根据Module里的描述,注入被调用的对象。 使用Annotation 使用 支持自定义Annotation标注,对于相同的接口定义的对象引用,为它们标注上不同的自定义Annotation注释,就可以达到同一个类里边的同一个接口的引用,注射给不同的实现,在Module里用标注做区分,灵活性大大增加。 使用Annotation也未必是好事,范型等新特性也未必是好事,目前大多的服务器均不支持jdk1.5,wls要9以前才支持,而目前的客户由于价格原因也很少选用wls9的,至少我们做过的项目中都没有。功能再强,客户不需要,何用? 运行效率装载spring配置文件时,需解析xml,效率低,getBean效率也不高,不过使用环境不会涉及到getBean,只有生产环境的时候会用到getBean,在装载spring应用程序的时候,已经完成全部的注射,所以这个低效率的问题不是问题。使用Annotation,cglib, 效率高与spring最明显的一个区别,spring是在装载spring配置文件的时候把该注入的地方都注入完,而Guice呢,则是在使用的时候去注射,运行效率和灵活性高。 类耦合度耦合度低,强调类非侵入,以外部化的方式处理依赖关系,类里边是很干净的,在配置文件里做文章,对类的依赖性极低。高,代码级的标注,DI标记@inject侵入代码中,耦合到了类层面上来,何止侵入,简直侵略,代码耦合了过多guice的东西,大大背离了依赖注入的初衷,对于代码的可维护性,可读性均不利 类编写时需要编写xml,配置Bean,配置注入只需声明为@inject,等着被注入,
上一篇:Generic Data Access Objects 设计模式
下一篇:JAVA加密解密---自定义类加载器应用
|