依赖注入是目前Java开发过程中经常遇到的情况。现在常用的依赖注入工具有:
- Google Guice
- SpringFramework
- PicoContainer
- Dagger
这其中个人观点是兼容JSR330标准的Guice易用性最好。SpringFramework历史非常悠久,有自己的一套依赖注入体系。Pico比较轻量,不过需要手工添加Bean类到容器,用起来有点烦。Dagger使用注解处理工具,其性能非常好,是一种很有前途的DI方案。另外还有两种运行时的DI方案也放进了这个测试当中:
- Feather (https://github.com/zsoltherpai/feather)
- Genie (https://github.com/osglworks/java-di)
Feather是超轻量级的方案,部分兼容JSR330标准,包括@Named注解。而Genie则是介于Feather和Guice之间的,相较于Feather提供了更多的特性,但不像Guice那么重。
下面是测试结果:
1. Injector初始化、装配一个bean object graph以及获取Bean实例:
Starting up DI containers & instantiating a dependency graph 4999 times: --------------------------------------------------------------------------------------- Guice 1613 ms Feather 106 ms Dagger 232 ms Pico 654 ms Genie 416 ms Spring 37520 ms
初始化和获取第一个Bean实例时间分开计算的情况:
Split Starting up DI containers & instantiating a dependency graph 4999 times: --------------------------------------------------------------------------------------- Guice start: 642ms, fetch 1197ms Feather start: 13ms, fetch 138ms Dagger start: 98ms, fetch 215ms Pico start: 228ms, fetch 365ms Genie start: 359ms, fetch 197ms Spring start: 33039ms, fetch 5072ms2. 使用已有的Injector获取Bean实例:
Runtime benchmark, fetch bean for 499999 times: -------------------------------------------------- Guice 559 ms Feather 241 ms Dagger 152 ms Genie 162 ms Pico 1946 ms Spring 25809 ms
测试代码:https://github.com/greenlaw110/di-benchmark,此项目代码源自https://github.com/zsoltherpai/feather/tree/master/performance-test。
如果感觉有问题的地方,欢迎提Issue,如有Pull请求更好。如果有其他DI方案的童鞋,也欢迎发送Pull请求
引用来自“notreami”的评论
然而还是用Spring,汽车虽然没有飞机快,但是汽车容易改造和维修啊。。仅就依赖注入而谈,Spring并不比其他几种方案简单易用。另外Spring在其中也是属于巨人级的,如果Spring是汽车的话,Guice算是摩托车,其他几种差不多算是自行车了
攒一个,在服务器领域,我觉得暂时难以用其他代替spring
引用来自“yong9981”的评论
发了一个Pull给你(加入我最近做的jBeanBox),感觉.Net里DI框架一大把,Java里就少多了,这个测试只是针对构造器测试,没有属性注入,有点简单了。