Atitit.guice3 ioc  最佳实践 o9o

1. Guice的优点and跟个spring的比较
1

2. 两个部分:::绑定and注入@Inject 1

3. 绑定所有的方法总结 2

3.1. 绑定自身。代替new..binder.bind(BeanService1.class);绑定自身 2

3.2. 1.1.1 链式绑定 2

3.3. 使用多个同样的接口,不一样的实现,使用命名绑定Annotations命名绑定 2

3.4. 3)绑定注释和实例基本类型String、int这样的基本类型
3

3.5. 实例绑定 3

3.6. 默认绑定 4

3.7. 单例绑定 4

4. 别的anno 说明 4

4.1. @ImplementedBy ,吧推荐,直接父类/接口指定实现类 4

4.2. @ProvidedBy  复杂对象的生成... 4

5. 跟spring的集成 5

6. Guice的缺点 5

7. 参考 5

1. Guice的优点and跟个spring的比较

快速100倍...

不需要配置文件...简单... Spr使用注解也要配置文件配置sacn package...麻烦的..

有编译器检查和重构支持 ,因为code实现

2. 两个部分:::绑定and注入@Inject

绑定Module

Guice的核心就是com.google.inject.Module,它类似于Spring的bean工厂

3.2 属性注入

1 属性绑定的目的是告诉Guice,当创建该类型的对象时,哪些属性也需要进行依赖注入。用一个例子来看:

2 其它方面,比如说Struts2的Action或Service层之间的注入等,直接用@Inject就得了,不要那么多set,get,

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

3. 绑定所有的方法总结

3.1. 绑定自身。代替new..binder.bind(BeanService1.class);绑定自身

像BeanService1是个实现类而没有实现什么接口,它当然也可能被其他类注入,可以使用 默认绑定自身,尽管这样做没什么意义,对于注入的类参数,Guice识别出来后会直接创建。

或者使用.binder.bind(BeanService1.class);

3.2. 1.1.1 链式绑定

链式绑定是最简单,最直接,也是使用最多的绑定方式。

3.3. 使用多个同样的接口,不一样的实现,使用命名绑定Annotations命名绑定

链式绑定就不好区分该用哪种实现了。可以把Annotations绑定方式看作是链式绑定的一种扩展,专门用来解决这种同一个接 口有多种实现的问题。Annotations绑定又可以分为两种,一种是需要自己写Annotations,另外一种则简化了一些。

使用@Named的方式和上面自己写Annotation的方式很类似,只不过做了相应的简化,不再需要自己去写Annotation了。[java]view plaincopy

3 public class RealBillingService implements BillingService {

4

5   @Inject

6   public RealBillingService(@Named("Checkout") CreditCardProcessor processor,

7 bind(CreditCardProcessor.class)

8     .annotatedWith(Names.named("Checkout"))

9     .to(CheckoutCreditCardProcessor.class);

3.4.  3)绑定注释和实例基本类型String、int这样的基本类型

。如果被注入的是如String、int这样的基本类型,需要做两件事情:一是对被注入的参数加上名称注释@Named,如下所示:

@Inject

public void setName(@Named("beanService1Name") String name) {

this.name = name;

}

@Inject @Named("thql")

public String testHql;

bd.bindConstant().annotatedWith(Names.named("thql")).to(" from TUserUsers ");

bind(String.class)

.annotatedWith(Names.named("JDBC URL"))

.toInstance("jdbc:mysql://localhost/pizza");

3.5. 实例绑定

上面介绍的链式绑定是把接口的class对象绑定到实现类的class对象,而实例绑定则可以看作是链式绑定的一种特例,它直接把一个实例对象绑定到它的class对象上。

?

1

2

3

4

5

6

bind(String.class)

.annotatedWith(Names.named("JDBC URL"))

.toInstance("jdbc:mysql://localhost/pizza");

bind(Integer.class)

.annotatedWith(Names.named("login timeout seconds"))

.toInstance(10);

3.6. 默认绑定

Xx=new xx()

3.7. 单例绑定

bind(AnotherConcreteClass.class).in(Singleton.class);

binder.bind(HelloWorld.class).to(HelloWorldImplAgain.class).in(Scopes.SINGLETON);

事实上Guice提供两种Scope,com.google.inject.Scopes.SINGLETON和com.google.inject.Scopes.NO_SCOPE,所谓没有scope即是每次生成一个新的实例。

或者...

@Singleton

     public class HelloWorldImpl implements HelloWorld {

3.8. 指定构造函数绑定

在configure方法中,将一种类型绑定到另外一种类型的过程中,指定目标类型用那种构造函数生成对象。

?

1

2

3

4

5

6

7

8

9

10

11

public class BillingModule extends AbstractModule {

@Override

protected void configure() {

try {

bind(TransactionLog.class).toConstructor(

DatabaseTransactionLog.class.getConstructor(DatabaseConnection.class));

} catch (NoSuchMethodException e) {

addError(e);

}

}

}

这种绑定方式主要用于不方便用注解@Inject修饰目标类型的构造函数的时候。比如说目标类型是第三方提供的类型,或者说目标类型中有多个构造函数,并且可能会在不同情况采用不同的构造函数。

4. 别的anno 说明

4.1. @ImplementedBy ,在父类型中进行绑定

4.2.  吧推荐,直接父类/接口指定实现类

@ImplementedBy(Class)的注释方式。可以直接从你的接口指向一个缺省的实现,而省略掉对com.google.inject.Module的实现。其实这样就违背了多态的原则,一般使用较少,最后还是把控制权交给Module来处理。

这个通常十做为默认实现类来实现兰,还是k有用的....走十好像只能应用到个接口上...

4.3. @ProvidedBy  复杂对象的生成...

如果方法中创建对象的过程很复杂,我们就会考虑,是不是可以把它独立出来,形成一个专门作用的类

参考 DI框架 Google-Guice入门介绍 - OPEN 开发经验库.htm

4.3.1.1. 在@Provides方法中进行绑定

5. 跟spring的集成

10 final BeanFactory beanFactory = new ClassPathXmlApplicationContext(

11                 new String[] { "applicationContext.xml", "daoContext.xml" });

12         binder.bind(BeanFactory.class).toInstance(beanFactory);

定义了Guice与Spring整合后,将spring工厂也由Guice托管

13 binder.bind(HelloWorld.class).toProvider(

14                 fromSpring(HelloWorld.class, "helloWorld"));

6. Guice的缺点

Guice当然也有缺点——太过于简单。不少JavaEE开发人员感觉似乎没有什么实际价值,更像是一种玩具。但我看好Guice的思想——简单而且类型安全。

7. 参考

Google-Guice入门介绍 - forlong401的专栏 - 博客频道 - CSDN.NET.htm

Guice真的无法享受企业级组件吗-梧桐雨—168-ITPUB博客.htm

google guice 绑定常量的另类用法----读取并注入配置信息 - Sky's blog - BlogJava.htm

DI框架 Google-Guice入门介绍 - OPEN 开发经验库.htm

Atitit.guice3 ioc 最佳实践 o9o的更多相关文章

  1. atitit.提升兼容性最佳实践 o9o

    atitit.提升兼容性最佳实践 o9o.doc 1. Atitit.兼容性的"一加三"策略 1 2. 扩展表模式 1 3. 同时运行模式 1 3.1. 完美的后向兼容性 2 3. ...

  2. atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php

    atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php \ 1. 泛型历史 1 由来 1 2. 泛型的机制编辑 1 机制 1 编译机制 2 3. 泛型方法定义1::前定义 ...

  3. atitit.提升兼容性最佳实践 p825.doc

    atitit.提升兼容性最佳实践 p825.doc 1. Atitit.兼容性的“一加三”策略1 2. 扩展表模式2 3. 同时运行模式2 3.1. 完美的后向兼容性3 3.2. 虚拟机模式3 3.3 ...

  4. atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29

    atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29 1. 三 绑定方式的介绍1 2. To接口,链式绑定,用的最多的1 3. toC ...

  5. Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php

    Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzip ...

  6. Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全

    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全 1. #====提升抽象层次1 2. #----使用通用单词1 3. #===使用术语..1 4.  ...

  7. Atitit. 拉开拉链zip文件 最佳实践实施 java c# .net php

    Atitit. 拉开拉链zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzi ...

  8. Atitit.log日志技术的最佳实践attilax总结

    Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...

  9. Atitit 词法分析器的设计最佳实践说明attilax总结

    Atitit 词法分析器的设计最佳实践说明attilax总结 1.1. 手写的优点:代码可读,对源代码中的各种错误给出友好的提示信息,用户体验高,1 1.2. 使用状态表比较简单,dfa比较麻烦1 1 ...

随机推荐

  1. Delphi下使用Oracle Access控件组下TOraSession控件链接

    Delphi下使用Oracle Access控件组下TOraSession控件链接数据库,使用  orsn1.Options.Direct:=true;  orsn1.Server:=IP:Port: ...

  2. VS调试在Win7(vista系列)操作系统下 HttpListener拒绝访问解决办法

    一. VS调试在Win7(vista系列)操作系统下 HttpListener无法绑定多个 指定IP.端口问题 来自:http://www.cnblogs.com/ryhan/p/4195693.ht ...

  3. VirtualBox中的虚拟机要如何设置,才能够上网

    VirtualBox中有4种网络连接方式:1. NAT2. Bridged Adapter3. Internal4. Host-only Adapter 一般设置成NAT网路就可以,但是由于我在公司上 ...

  4. jQuery选择器和DOM操作——《锋利的jQuery》(第2版)读书笔记1

    第1章 认识jQuery jQuery有以下优势: 轻量级: 强大的选择器: 出色的DOM操作的封装: 可靠的事件处理机制: 完善的Ajax: 不污染顶级变量: 出色的浏览器兼容性: 链式操作方式: ...

  5. python-->基础-->002-->input & raw_input

    一.input与raw_input的区别 1.raw_input()说明 a = raw_input("input content:")print a,type(a) 输出结果: ...

  6. 在updatepanel使用colorbox无效

    今天在给一个使用colorbox的页面加了一个updatepanel后,colorbox无效了,原因是以前的页面初始化colorbox是用 $(document).ready(function(){ ...

  7. IOS一些好的用户体验设置

    1,下载图片时,如果 用户操作UI,那么就停止子线程,用户停止操作子线程时,开启子线程继续下载. SDWebImage  :专门下载图片. 2,网络请求时.本地要进行一些验证,以减少服务器的压力.

  8. Android之ImageView 设置宽高

    方案一: 设置布局参数 imageView.setLayoutParams(new LinearLayout.LayoutParams(newWidth, newWidth));

  9. try catch finally return之间的关系

    一.try catch finally return之间的关系: 正在写dsoFramer的时候,同事突然说面试的时候问的一个问题,catch和return那个先执行,我瞬间迷茫了,然后整理了整理,稍 ...

  10. html5 上传图片.net实现

    jQuery插件之ajaxFileUpload   搞了一夜,还没弄出来随copy了一篇博客... 一.ajaxFileUpload是一个异步上传文件的jQuery插件. 传一个不知道什么版本的上来, ...