Guice最佳实践

学习Guice的时候翻译的,可以通过下面的地址获取最新的英文原文:

http://code.google.com/p/google-guice/wiki/GuiceBestPractices

 


Guice最佳实践
字段(属性)注入 VS 方法注入 VS 构造方法注入
字段注入(属性注入)
  • +最简洁的语法(适合于简单的情况)
  • -无法对注入做其他工作(比如再注入一个配置文件里的值等等)
  • -类将难以测试
方法注入(普通方法)
  • +不是字段(属性)注入
  • +只适合于工作在一些不常见的有特别要求的地方
构造方法注入
  • +属性可以是final的
  • +即使不使用Guice,也无法忽略注入的操作
  • +有利于一眼就看出如何类的依赖情况
  • +这是正确的使用构造函数的方法(构造函数就应该这么使用)
  • -无法选择性注入(?No optional injections ?)
  • -对于Servlet这类Guice无法自己进行创建的类不能工作
  • -子类需要知道父类需要被注入的类型
  • -Less convenient for tests that only "care about" one of the parameters
选择Scope
  • 如果一个对象是无状态的,并且开销不大,那谁又在乎它的Scope呢
  • 如果对象是有状态的,那它应该是明显能被看出来有状态,但你应该写一个自定义的Scope
  • 永远不要在线程不安全的类上使用单例或者使用SessionScope
  • 对于@RequestScoped和"no scope",你不需要担心会被同时请求
  • 单例主要用在下面两种类上
    • 创建对象的开销比较大
    • 特殊资源 (比如链接池)
  • Session scope 是被高估的
    • 尽量在“会话”的Scope替代Session scope(Bob,快点完成它!)
    • 如果你想缓存一些东西,那么使用缓存而不是要放在Session中

热心的单例

创建单例最普通的方式是使用

binder.bind(Service.class).toInstance(new MyService());

但这并不是一个好方法!

  • Guice并没有构造MyService, 所以你只能得到字段(属性)注入和方法注入,而无法进行构造函数注入。
  • 你的单例将被初始化,即使没有哪个对象调用 createInjector()!
    • 这不应该运行在一个真正的App中。
  • 这样就没有机会进行“懒加载”,在测试的时候也要使用这个Module
为什么不让Guice去做它最善长的事(创建)?

binder.bind(Service.class).to(MyService.class).asEagerSingleton();

 

这最大的坏处是你要使用一个有名字的类,而你可能会想到提供一个匿名的实例,好吧。

你可能感兴趣的:(工作,servlet,Google)