由于Spring太过庞大,所以本人也一直都不太喜欢,当guice1出来时,就关注过一阵子,但始终没有行动去试用,听说2.0出来了,最近闲着也没事,就去试用了一下,单从IOC方面来说,做得的确比较出色。
于是做了一个例子,把常用的功能都试了一下,其中需要的JAR包只有两个:
aopalliance.jar
guice-2.0.jar
下面是例子的代码:
public interface Service {
public void sayHello();
}
public class ServiceImp implements Service {
public void sayHello() {
System.out.println("ServiceImp say Hello !");
}
}
然后需要一个Model建立接口与类之间的映射关系,
由于包含的功能比较多,所以代码相对有一点复杂,不过这个类是最重要的
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import com.google.inject.AbstractModule;
import com.google.inject.Binder;
import com.google.inject.Provides;
import com.google.inject.name.Names;
import demo.HeroModule;
public class ServiceModel extends AbstractModule {
@Override
protected void configure() {
// 与在Service接口上声明@ImplementedBy(ServiceImp.class)等价
// 手工实例化想绑定的对象
// this.bind(Service.class).toInstance(new ServiceImp());
// this.bind(Service.class).to(ServiceImp.class);
// When your @Provides methods start to grow complex, you may consider
// moving them to a class of their own
this.bind(Service.class).toProvider(ServiceProvider.class);
// this.bind(String.class).annotatedWith(Names.named("username")).toInstance("qiuqiu");
this.bindConstant().annotatedWith(Names.named("username")).to("qiuqiu");
loadProperties();
}
/*
* When you need code to create an object, use an @Provides method. The
* method must be defined within a module, and it must have an @Provides
* annotation. The method's return type is the bound type. Whenever the
* injector needs an instance of that type, it will invoke the method.
*/
@Provides
public User provide() {
System.out.println("++++++++=============");
User user = new User();
user.setUsername("myprovide");
return user;
}
private void loadProperties() {
InputStream stream = this.getClass().getResourceAsStream(
"/app.properties");
Properties appProperties = new Properties();
try {
appProperties.load(stream);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Names.bindProperties(this.binder(), appProperties);
}
}
Provider在管理手工创建对象时会比@Provides灵活一些:
import com.google.inject.Provider;
public class ServiceProvider implements Provider<Service> {
@Override
public Service get() {
System.out.println("ServiceProvider==-=-=-=-=_+_+_+_+_+_+_+_+");
// TODO Auto-generated method stub
Service service = new ServiceImp();
return service;
}
}
还有一辅助类:
public class User{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
还有一属性文件app.properties,很简单:
db.user=mysql
db.pwd=2009
经过上面一系列的准备,就可以进行测试了了:
import org.testng.Assert;
import org.testng.annotations.Test;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;
public class Client {
private Service service;
private User user;
private String username;
private String db_user;
private String db_pwd;
@Inject
public void setDB(@Named("db.user") String db_user,
@Named("db.pwd") String db_pwd) {
this.db_user = db_user;
this.db_pwd = db_pwd;
}
@Inject
public void setUsername(@Named("username") String username) {
this.username = username;
}
@Inject
public void setUser(User user) {
this.user = user;
}
@Inject
public void setService(Service service) {
this.service = service;
}
@Test
public void testGuice() {
Injector injector = Guice.createInjector(new ServiceModel());
// 如果不用@Inject注入,则用这种方法
// Service service = injector.getInstance(ServiceImp.class);
injector.injectMembers(this);
service.sayHello();
}
@Test
public void testBindConstant() {
System.out.println("username=" + username);
}
@Test
public void testBindProvides() {
Injector injector = Guice.createInjector(new ServiceModel());
injector.injectMembers(this);
// 必须要调用上面的注入方法
Assert.assertEquals(user.getUsername(), "myprovide");
}
@Test
public void testProperties() {
Injector injector = Guice.createInjector(new ServiceModel());
injector.injectMembers(this);
Assert.assertEquals(db_user, "mysql");
Assert.assertEquals(db_pwd, "2009");
}
}
大体过程就这样,还有一些细小的功能没有仔细去体会,以后有时间再来完善吧!
分享到:
相关推荐
guice 学习资料,快速掌握guice的编程技巧以及了解其机制。
"Guice 中文文档 例子" 包含了 Guice 的中文文档和实际操作示例,这对于学习 Guice 非常有帮助。文档可能涵盖了以下内容: 1. **基础概念介绍**: 解释依赖注入的概念和 Guice 的基本工作原理。 2. **模块配置**: ...
2. **易用性**:Guice的学习曲线平缓,开发者可以快速上手。 3. **可扩展性**:支持自定义绑定和拦截器,方便集成其他框架或库。 4. **灵活性**:Guice允许在运行时动态地配置依赖关系。 5. **强大的社区支持**:...
- **简洁的API**:Guice的API设计简单易用,减少了代码量,降低了学习曲线。 - **强大的注解支持**:Guice对Java标准注解和自定义注解的广泛支持,使代码更具表达力。 - **模块化**:Guice的模块化设计方便了组件...
**基于Guice的简单项目** 在Java开发中,依赖注入(Dependency Injection,简称DI)是一种设计...通过学习和实践这个项目,开发者可以更好地掌握Guice的工作原理和使用技巧,为未来的Java项目带来更高效的代码结构。
- **实战应用**:学习如何使用Guice构建真实的Web应用程序,例如使用Struts 2或Wicket开发Web应用,以及如何使用Hibernate进行数据持久化操作。 #### 四、Guice的关键特性 - **依赖注入**:通过注解的方式声明依赖...
在Guice 3.0源码中,我们可以深入学习以下几个关键知识点: 1. **依赖注入(Dependency Injection)**:Guice的核心概念是依赖注入,它允许我们声明所需的服务或对象,而无需在代码中硬编码创建这些对象的方式。这...
在阅读《初试Guice》这篇博客文章时,你可能会学习到如何设置Guice模块,如何声明和注入依赖,以及如何在项目中集成和使用Guice。作者可能会分享一些最佳实践和常见陷阱,帮助读者更好地理解和应用Guice。此外,文章...
在学习Guice时,你可以关注它的注解驱动配置、模块化设计以及对AOP(面向切面编程)的支持。 MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置...
Guice用户指南翻译提供了详细的文档,帮助开发者理解和使用Guice框架,包括安装、配置、依赖注入、生命周期管理以及与其他框架的集成等各个方面,是学习和应用Guice的重要资源。通过深入阅读和实践,开发者可以更好...
MyBatis-Guice 是一个将 MyBatis ORM 框架与 Google Guice 依赖注入框架整合的...通过学习和分析这些代码,开发者可以深入理解如何在实际项目中集成 MyBatis 和 Guice,以及它们如何协同工作以提升开发效率和代码质量。
通过本文档的学习,我们可以深刻理解到Guice作为依赖注入框架的重要性。它不仅能够解决静态引用带来的问题,还能显著提高代码的可读性和可维护性。对于那些希望提升Java应用的质量、易测性和可扩展性的开发者来说,...
在"Guice入门教程HelloWorld篇"中,我们将学习如何使用Guice来构建简单的Java应用程序。首先,我们需要理解Guice的核心概念——模块(Module)和绑定(Binding)。模块是Guice配置的核心,它定义了哪些类应该被实例...
Apache Shiro 和 Google Guice 的整合是为了解决在Java应用程序中实现权限管理的问题。...通过学习和实践这种整合方式,开发者可以更好地理解和掌握 Java 安全框架的使用,提升应用的安全性和用户体验。
Java Guice 3.0是一款轻量级的依赖注入(Dependency Injection, DI)框架,它致力于简化Java...通过深入学习和使用Guice,你可以更好地理解和实践依赖注入这一重要设计原则,并在实际项目中提升开发效率和代码质量。
这个`mybatis-guice-3.4.jar`文件正是这个框架的一个版本,适用于初学者了解和学习如何在项目中集成MyBatis与Guice。 首先,我们来了解一下MyBatis。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及...
标题《Learning Google Guice》指出本文档是关于学习谷歌Guice的,Guice是由谷歌开发的一个轻量级的依赖注入框架,其核心理念是简化Java应用程序中组件的创建和组装过程,通过依赖注入提高模块间的解耦,从而使得...
1. **Google Guice**: 学习依赖注入的概念,理解如何通过注解配置和管理对象的生命周期,以及如何使用ThrowingProviders处理初始化异常。 2. **设计模式**:Guice框架应用了许多设计模式,如工厂模式、单例模式等,...
在提供的`struts2-guice`压缩包中,可能包含了实现以上步骤的示例代码,包括Struts2的配置文件、Guice模块、Action类等,供开发者参考和学习。通过这样的整合,开发者可以利用Guice的强大功能,让Struts2应用的代码...