Guice还具备一些可选的特性好比:自定义scopes,传递依赖,
静态属性注入,与Spring集成和AOP联盟方法注入等。
一部分人认为,Guice能够彻底替代spring, 由于对于DI组件框架来讲, 性能是很重要的, guice比spring快十倍左右, 另外, 也是最重要的一点, 使用spring很容易写成service locator的风格, 而用guice, 你会很天然的造成DI风格.
甚至说,guice简单超轻量级的DI框架效率是spring的100倍,Spring使用XML使用将类与类之间的关系隔离到xml中,由容器负责注入被调用的对象,而guice将类与类之间的关系隔离到Module中,声名何处须要注入,由容器根据Module里的描述,注入被调用的对象,使用Annotation使用支持自定义Annotation标注,对于相同的接口定义的对象引用,为它们标注上不一样的自定义Annotation注释,就能够达到同一个类里边的同一个接口的引用,注射给不一样的实现,在Module里用标注作区分,灵活性大大增长。
运行效率装载spring配置文件时,需解析xml,效率低,getBean效率也不高,不过使用环境不会涉及到getBean,只有生产环境的时候会用到getBean,在装载spring应用程序的时候,已经完成所有的注射,因此这个低效率的问题不是问题。使用Annotation,
cglib,效率高与spring最明显的一个区别,spring是在装载spring配置文件的时候把该注入的地方都注入完,而Guice呢,则是在使用的时候去注射,运行效率和灵活性高。类
耦合度耦合度低,强调类非侵入,之外部化的方式处理依赖关系,类里边是很干净的,在配置文件里作文章,对类的依赖性极低。高,代码级的标注,DI标记@inject侵入代码中,耦合到了类层面上来,何止侵入,简直侵略,代码耦合了过多guice的东西,大大背离了依赖注入的初衷,对于代码的可维护性,可读性均不利类编写时须要编写xml,配置Bean,配置注入只需声明为@inject,等着被注入.仅支持IOC否,spring目前已经涉猎不少部分是,目前仅仅是个DI容器是否易于
代码重构统一的xml配置入口,更改容易配置工做是在Module里进行,和spring殊途同归支持多种注入方式
构造器,setter方法Field,构造器,setter方法灵活性1,若是同一个接口定义的引用须要注入不一样的实现,就要编写不一样的Module,烦琐。
若是你想注射的一个实现,你还未知呢,怎么办呢,spring是没办法,事先在配置文件里写死的,而Guice就能够作到,就是说我想注射的这个对象我还不知道注射给谁呢,是在运行时才能获得的的这个接口的实现,因此这就大大提升了依赖注射的灵活性,动态注射。
与现有框架集成度高
一、众多现有优秀的框架(如struts1.x等)均提供了spring的集成入口,并且spring已经不只仅是依赖注入,包括众多方面。
二、Spring也提供了对Hibernate等的集成,可大大简化开发难度。
三、提供对于orm,rmi,webservice等等接口众多,体系庞大。能够与现有框架集成,不过仅仅依靠一个效率稍高的DI,就想取代spring的地位,有点难度。配置复杂度在xml中定位类与类之间的关系,难度低代码级定位类与类之间的关系,难度稍高。
编辑本段2、spring与guice的区别
借斧子的例子说一说spring与guice的区别。
看下边的例子:对于不一样社会形态下一我的(java对象,调用者)须要一把斧子(java对象,被调用者)。
(1)原始社会时
劳动社会基本没有分工,须要斧子的人(调用者)只好本身去磨一把斧子,每一个人拥有本身的斧子,若是把你们的石斧改成铁斧,须要每一个人都要学会磨铁斧的本领,工做效率极低。对应Java里的情形是:java程序里的调用者new一个被调用者的实例。类
耦合度极高,修改维护烦琐,效率极低。
(2)工业社会时
工厂出现,斧子再也不由普通人完成,而由工厂生产,当人们须要斧子的时候,能够到工厂购买斧子,无需关心斧子是怎么制造出来的,若是废弃铁斧为钢斧,只需改变工厂的制造工艺便可,制做工艺是工厂决定的,工厂生产什么斧子,工人们就得用什么斧子。对应的java里的情形是:Java程序的调用者能够以来
简单工厂建立被调用者,变化点被隔离到了简单工厂里,虽然
耦合度下降,可是调用者会和工厂耦合,并且须要定位本身的工厂
(3)近代工业社会
工厂蓬勃发展,人们须要什么斧子,只须要提供一个斧子图形,商家会按照你提供的图形将你的斧子订作好,送上门。对应Java里的情形:spring的依赖注入
(4)按须要分配社会
信息进入现代化,人们再也不去工厂购买斧子,再也不拘泥于须要什么斧子事先画好什么样的图形,只须要打个电话,描述一下须要什么类型的斧子,或许想打造一个物美价廉的斧子,商家会根据市场零件的价格,计算出最优制做工艺,打造最适合的斧子送过来,更加信息化,更加人性化。对应Java里的情形:基于描述的注入,动态的,灵活简单的注入,如:Guice。对于该不应使用Guice,我想也是仁者见仁,智者见智,就象好多论坛里动不动有人会在那里讨论到底学Java仍是学.net或者是使用eclipse仍是Jbuilder的这类无聊话题,适合和知足项目需求的,又能省工省力简单的完成工做的,就是最好的。