额 标题 "guice使用初探:取代工厂模式返回单例 " 似乎取得不太对 这边要取代的是利用工厂模式返回 单例(好像说法没变吗喂....)
分类还是放在编程语言里了..话说企业架构里用guice本菜鸟真的没见过啊(本菜鸟除了SSH SSM 好像没见过其他的了 跪Orz..)
好了 废话说到这(下面也许还会有..)
需要的jar包:
guice下载地址:
https://code.google.com/p/google-guice/
这里使用guice的DI(依赖注入)完成IoC(控制反转) 将数据库相关对象注入给DAO的属性(Field)
要注入的类是:
ConnectionUtil
注入的DAO是:
AccountDao
步奏:
首先建立一个类继承Guice的相关抽象类 来充当注入的提供者:
代码1:
package org.cc.mongo.infrustructure.di; import java.net.UnknownHostException; import javax.inject.Singleton; import org.cc.mongo.infrustructure.ConnectionUtil; import com.google.inject.AbstractModule; import com.google.inject.Provides; public class ConnectionUtilModule extends AbstractModule { @Override protected void configure() { // 这里可以写绑定关系 将接口与实现类绑定 注入给接口绑定的实现类使用bind(实现类).to(接口) } @Provides //提供者标记 @Singleton //表示是单例 util只会被初始化一次 ConnectionUtil provideAgentFinder() //返回注入器需要的类型 { /**创建util并返回具体值*/ ConnectionUtil util = new ConnectionUtil(); try { util.configure().connect(); } catch (UnknownHostException e) { e.printStackTrace(); } return util; } }
接下去在AccountDao中注入:
代码2:
public class AccountDao extends BaseDao { public static final String COLLECTION_NAME="account"; private ConnectionUtil conn; private DBCollection collection; @Inject public AccountDao(ConnectionUtil conn) throws UnknownHostException { super(); this.conn=conn; this.collection=conn.getCollection(COLLECTION_NAME); } ... ... }
然后测试是这样的:
代码3:
@Test public void test() { Injector injector = Guice.createInjector(new ConnectionUtilModule()); AccountDao ad = injector .getInstance(AccountDao.class); Account acc = new Account(); acc.setName("x15"); acc.setInfo("empty"); acc.setPassword("23456"); ad.add(acc); AccountDao ad2 = injector .getInstance(AccountDao.class); //检查ConnectionUtil对象是否是单例 acc.setName("x16"); acc.setInfo("empty"); acc.setPassword("23456"); ad2.add(acc); }
然后运行这个测试 查看结果:
2013-08-15 00:24:38:560 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - mongo初始化成功..
2013-08-15 00:24:38:567 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - Connect()成功
2013-08-15 00:24:38:567 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - Connect()成功
可见只connect()了一次 (每进行一次连接就会输出一次)
为了再看得清楚一点 把代码1中的@Singleton标记去除 再运行一次测试(以上的数据也要做调整 因为我在name里建了一个唯一索引 不然会出错):
2013-08-15 00:56:37:341 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - mongo初始化成功..
2013-08-15 00:56:37:347 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - Connect()成功
2013-08-15 00:56:37:416 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - mongo初始化成功..
2013-08-15 00:56:37:416 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - Connect()成功
2013-08-15 00:56:37:347 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - Connect()成功
2013-08-15 00:56:37:416 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - mongo初始化成功..
2013-08-15 00:56:37:416 INFO [main] org.cc.mongo.infrustructure.ConnectionUtil - Connect()成功
发现连接了两次 说明前面的的确是单例
这里总结一下一些使用到的annotation(JSR-330):
- @Inject:和@Resource用处相近 注入对象使用 可以用在构造方法 setter以及属性上
- @Provides:AbstractModule中使用(可以写多个 还可以不用这个注解 实现Provider接口) 表示提供者
- @Singleton:和@Provides一起使用表示提供者提供的是单例
这只是guice的简单使用 更多使用各位有需求的话可以自己去找一找^_^
相关推荐
Maven坐标:com.google.inject:guice:4.0; 标签:google、inject、guice、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...
标签:extensions、google、assistedinject、inject、guice、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
sisu-guice-2.1.7-noaop.jar
### Java on Guice:深入理解依赖注入 #### 核心概念与价值 “Java on Guice”这篇文档探讨了依赖注入(Dependency Injection, DI)在Java应用中的实践方式及其带来的诸多好处。它由Google的Bob Lee和Kevin ...
当您在注入 dropwizard 配置或环境的类上有一个 guice 单例时,就会发生这种情况。 为避免这种情况,您可以: 将 guice 阶段设置为“DEVELOPMENT”,但所有内容都会以惰性模式加载 使用这样的包
标签:google、inject、extensions、guice、multibindings、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变...
它极大地简化了开发过程中的工厂模式编写工作,提高了代码的可测试性和模块化程度。 #### 使用 Guice 的优势 - **提高可维护性**:通过依赖注入,代码可以更容易地进行重构和扩展。 - **增强可测试性**:依赖注入...
Java Guice 3.0是一款轻量级的依赖注入(Dependency Injection, DI)框架,它致力于简化Java应用程序的构建过程,让组件之间的依赖关系更加清晰和易于管理。依赖注入是一种设计模式,它允许代码在运行时自动管理和...
标签:google、inject、extensions、guice、multibindings、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...
sisu-guice-3.1.3-no_aop.jar
如果您使用Guice作为依赖项注入框架,并且想将自己的类注入到您创建的JAX-RS类中(例如“资源”和“过滤器”),则需要弥合这两个DI框架之间的鸿沟。 该模块旨在通过启动基于Jetty的Jersey服务器并初始化HK2与Guice...
#Intro 这是一个使用 Guice 评估 Java Websockets 使用情况的示例项目。 AngularJS 用于浏览器端的东西。 ##Usage 在进行任何操作之前,您应该在文件夹 angularjs-client/app 中运行bower install 。 该项目使用...
《Google Guice: Agile Lightweight Dependency Injection Framework》这本书不仅是一本关于Guice的技术指南,更是为专业Java开发者提供的宝贵资源。通过本书的学习,读者不仅能够掌握Guice的强大功能,还能深刻理解...
java8集合源码动机.md 动机 将所有内容连接在一起是应用程序开发的乏味部分。 有几种方法可以将数据、服务和表示类相互连接起来。 为了对比这些方法,我们将为披萨订购网站编写计费代码: public interface ...
本演示文稿通过对比工厂模式、手动依赖注入以及Guice框架下的依赖注入方式,展示了依赖注入的重要性和Guice带来的便利。通过采用Guice进行依赖注入,可以有效提高代码质量,降低维护成本,并增强系统的可测试性和...
`guice-2.0-no_aop.jar`是Guice的一个版本,不包含Aspect Oriented Programming(AOP)支持,这可能是因为在Android环境中,AOP的使用可能会增加复杂性和性能开销。 接下来,我们来看RoboGuice。RoboGuice是Guice的...
标签:google、inject、extensions、guice、servlet、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释...
2. **注解驱动**:Guice使用Java的注解来标记接口和实现,如`@Inject`用于标记构造函数、字段或方法,表示需要依赖注入。`@Singleton`表示该对象为单例,`@Named`用于指定特定的依赖实现。 3. **模块(Modules)**...
本话题主要探讨的是如何在Play框架中集成Guice依赖注入框架和MyBatis持久层框架,从而构建一个强大的Java web应用程序。Play框架是一个轻量级、基于Actor模型的web应用框架,而Guice则是Google提供的一个轻量级依赖...
标签:google、inject、extensions、guice、servlet、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,...