Atitit.guice3 ioc 最佳实践 o9o
Atitit.guice3 ioc 最佳实践 o9o
3.1. 绑定自身。代替new..binder.bind(BeanService1.class);绑定自身 2
3.3. 使用多个同样的接口,不一样的实现,使用命名绑定Annotations命名绑定 2
3.4. 3)绑定注释和实例基本类型String、int这样的基本类型
3
4.1. @ImplementedBy ,吧推荐,直接父类/接口指定实现类 4
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的更多相关文章
- atitit.提升兼容性最佳实践 o9o
atitit.提升兼容性最佳实践 o9o.doc 1. Atitit.兼容性的"一加三"策略 1 2. 扩展表模式 1 3. 同时运行模式 1 3.1. 完美的后向兼容性 2 3. ...
- atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php
atitit.泛型编程总结最佳实践 vO99 java c++ c#.net php \ 1. 泛型历史 1 由来 1 2. 泛型的机制编辑 1 机制 1 编译机制 2 3. 泛型方法定义1::前定义 ...
- atitit.提升兼容性最佳实践 p825.doc
atitit.提升兼容性最佳实践 p825.doc 1. Atitit.兼容性的“一加三”策略1 2. 扩展表模式2 3. 同时运行模式2 3.1. 完美的后向兼容性3 3.2. 虚拟机模式3 3.3 ...
- atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29
atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29 1. 三 绑定方式的介绍1 2. To接口,链式绑定,用的最多的1 3. toC ...
- Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php
Atitit. 解压缩zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzip ...
- Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全 1. #====提升抽象层次1 2. #----使用通用单词1 3. #===使用术语..1 4. ...
- Atitit. 拉开拉链zip文件 最佳实践实施 java c# .net php
Atitit. 拉开拉链zip文件 的实现最佳实践 java c# .net php 1. Jdk zip 跟apache ant zip 1 2. Apache Ant包进行ZIP文件压缩,upzi ...
- Atitit.log日志技术的最佳实践attilax总结
Atitit.log日志技术的最佳实践attilax总结 1. 日志的意义与作用1 1.1. 日志系统是一种不可或缺的单元测试,跟踪调试工具1 2. 俩种实现[1]日志系统作为一种服务进程存在 [2] ...
- Atitit 词法分析器的设计最佳实践说明attilax总结
Atitit 词法分析器的设计最佳实践说明attilax总结 1.1. 手写的优点:代码可读,对源代码中的各种错误给出友好的提示信息,用户体验高,1 1.2. 使用状态表比较简单,dfa比较麻烦1 1 ...
随机推荐
- [转载] 4. JebAPI 之 jeb.api.ui
本文转载自: https://www.zybuluo.com/oro-oro/note/145250 JebInstance可以通过getUI()方法来获得jeb.api.ui.JebUI. JebU ...
- python第十二天-----RabbitMQ
有一位小伙伴说让我去A站写博客可能会有很多人喜欢,真是搞不懂,北方哪里有卖萌?北方默认状态就是这么萌的!再者说了,这明明就是很专注于技术的博客嘛,能不能严肃点!知不知道什么叫帧? 学习到了数据库的相关 ...
- win下搭建uvm环境
UVM验证方法学,很好的验证工具,下面用ModelSim-uvm做一个Hello world. 1.安装modelsim se 10.1a 2.下载uvm_1.1d uvm-1.1d.tar.gz ...
- (转载)selenium-webdriver(python)
转载地址: http://www.cnblogs.com/fnng/p/3183777.html 本节重点: 简单对象的定位 -----自动化测试的核心 对象的定位应该是自动化测试的核心,要想操作一个 ...
- java.net.MalformedURLException: Illegal character in URL
在进行接口测试时,意外发现返回结果报java.net.MalformedURLException: Illegal character in URL,意思是“在URL中的非法字符”,我的参数是经过ba ...
- 如何把android中布局文件(.xml)与相关的类(.java)进行关联?
eg:把一个布局文件名为page1.xml与MainActivity.java(工程自动生成)进行 1.在存放使用资源的res文件夹下的layout文件夹内新建一个XML布局文件,如命名为:page1 ...
- c++垃圾回收代码练习 引用计数
学习实践垃圾回收的一个小代码 采用引用计数 每次多一个指针指向这个分配内存的地址时候 则引用计数加1 当计数为0 则释放内存 他的难点在于指针之间的复制 所有权交换 计数的变化 #include &l ...
- 【转】HTTP状态码(HTTP Status Code)
原文链接:http://www.chaoji.com/features/httpstatus.aspx 一些常见的状态码为: 200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - ...
- ns3模拟无线Ad hoc 网络通信
Ad hoc网络 Ad hoc网是一种多跳的.无中心的.自组织无线网络,又称为多跳网(Multi-hop Network).无基础设施网(Infrastructureless Network)或自组织 ...
- 在C代码中调用C++接口
一 在C源文件中调用C++封装的接口 例如: 要想在A.c文件中,调用生命在B.h,实现在B.cpp中的接口bool getMAC(char *mac_addr); 其实现方法 B.cpp 如下: / ...