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. 济南学习D2T2__数学分析题

    [问题描述]有N个数,随机选择一段区间,如果这段区间的所有数的平均值在[l,r]中则你比较厉害.求你比较厉害的概率.[输入格式]第一行有三个数N,l,r,含义如上描述.接下来一行有N个数代表每一个数的 ...

  2. 使用soureTree删除分支

    使用心得 1:使用pull拉取时,自己本地的更改不会覆盖掉 2:删除分枝时,直接选中,可以直接删除远程的分枝

  3. JDBC连接数据库(SQLServer和MySQL)配置总结

    [JDBC连接SQL Server] [准备工作] 1.下载Eclipse-JavaEE: 2.下载Tomcat8.0: 3.下载Microsoft JDBCDriver 4.1 for SQL Se ...

  4. vs代码段快捷键设置

    1 工具->代码段管理器

  5. C#中不同的线程对控件的更改

    .net 不允许跨线程个性其它线程创建的控件. 要想实现这个功能就需要用 InvokeRequired 检查是不是由该线程创建的控件,如果是直接操作,如果不是则 用Invoke 添加一个委托再加上参数 ...

  6. RAID配置

    一.madam -a      检测设备名称 -n      指定硬盘数量 -l       指定raid级别 -C     创建 -f       模拟硬盘故障 -r      移除硬盘 -a    ...

  7. linux eclipse epic perl padwalker

    1, 在Eclipse中安装EPIC:Help->Install New Software->Add:name:EPICLocation:http://e-p-i-c.sourceforg ...

  8. ajax返回类型dataType json和text比较

    $.ajax({ type: "post", url: "${ctx}/modules/fos/reference/echart", //dataType:'j ...

  9. 【状压dp】【bitset】bzoj1688 [Usaco2005 Open]Disease Manangement 疾病管理

    vs(i)表示患i这种疾病的牛的集合. f(S)表示S集合的病被多少头牛患了. 枚举不在S中的疾病i,把除了i和S之外的所有病的牛集合记作St. f(S|i)=max{f(S)+((St|vs(i)) ...

  10. WordPaster.exe安装教程

      安装教程: Firefox控件安装教程 Chrome控件安装教程 Chrome 45+控件安装教程 相关问题: 提示Runtime Error错误 360拦截 Chrome启用npapi Fire ...