`

guice的学习

阅读更多
由于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 中文文档 例子" 包含了 Guice 的中文文档和实际操作示例,这对于学习 Guice 非常有帮助。文档可能涵盖了以下内容: 1. **基础概念介绍**: 解释依赖注入的概念和 Guice 的基本工作原理。 2. **模块配置**: ...

    Guice用户中文指南

    2. **易用性**:Guice的学习曲线平缓,开发者可以快速上手。 3. **可扩展性**:支持自定义绑定和拦截器,方便集成其他框架或库。 4. **灵活性**:Guice允许在运行时动态地配置依赖关系。 5. **强大的社区支持**:...

    guice-3.0.rar

    - **简洁的API**:Guice的API设计简单易用,减少了代码量,降低了学习曲线。 - **强大的注解支持**:Guice对Java标准注解和自定义注解的广泛支持,使代码更具表达力。 - **模块化**:Guice的模块化设计方便了组件...

    基于guice的简单项目

    **基于Guice的简单项目** 在Java开发中,依赖注入(Dependency Injection,简称DI)是一种设计...通过学习和实践这个项目,开发者可以更好地掌握Guice的工作原理和使用技巧,为未来的Java项目带来更高效的代码结构。

    Google Guice: Agile Lightweight Dependency Injection Framework

    - **实战应用**:学习如何使用Guice构建真实的Web应用程序,例如使用Struts 2或Wicket开发Web应用,以及如何使用Hibernate进行数据持久化操作。 #### 四、Guice的关键特性 - **依赖注入**:通过注解的方式声明依赖...

    google guice 3.0源码

    在Guice 3.0源码中,我们可以深入学习以下几个关键知识点: 1. **依赖注入(Dependency Injection)**:Guice的核心概念是依赖注入,它允许我们声明所需的服务或对象,而无需在代码中硬编码创建这些对象的方式。这...

    初试Guice(转)

    在阅读《初试Guice》这篇博客文章时,你可能会学习到如何设置Guice模块,如何声明和注入依赖,以及如何在项目中集成和使用Guice。作者可能会分享一些最佳实践和常见陷阱,帮助读者更好地理解和应用Guice。此外,文章...

    ext extjs4学习经典实例 guice mybaits 简单权限 (无ext资源包和jar包)

    在学习Guice时,你可以关注它的注解驱动配置、模块化设计以及对AOP(面向切面编程)的支持。 MyBatis是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置...

    Guice用户指南翻译

    Guice用户指南翻译提供了详细的文档,帮助开发者理解和使用Guice框架,包括安装、配置、依赖注入、生命周期管理以及与其他框架的集成等各个方面,是学习和应用Guice的重要资源。通过深入阅读和实践,开发者可以更好...

    mybatis-guice

    MyBatis-Guice 是一个将 MyBatis ORM 框架与 Google Guice 依赖注入框架整合的...通过学习和分析这些代码,开发者可以深入理解如何在实际项目中集成 MyBatis 和 Guice,以及它们如何协同工作以提升开发效率和代码质量。

    Java on Guice

    通过本文档的学习,我们可以深刻理解到Guice作为依赖注入框架的重要性。它不仅能够解决静态引用带来的问题,还能显著提高代码的可读性和可维护性。对于那些希望提升Java应用的质量、易测性和可扩展性的开发者来说,...

    guice入门教程helloworld篇

    在"Guice入门教程HelloWorld篇"中,我们将学习如何使用Guice来构建简单的Java应用程序。首先,我们需要理解Guice的核心概念——模块(Module)和绑定(Binding)。模块是Guice配置的核心,它定义了哪些类应该被实例...

    shiro和guice整合,使用权限注解

    Apache Shiro 和 Google Guice 的整合是为了解决在Java应用程序中实现权限管理的问题。...通过学习和实践这种整合方式,开发者可以更好地理解和掌握 Java 安全框架的使用,提升应用的安全性和用户体验。

    Java guice3.0轻量级的依赖注入框架 组件

    Java Guice 3.0是一款轻量级的依赖注入(Dependency Injection, DI)框架,它致力于简化Java...通过深入学习和使用Guice,你可以更好地理解和实践依赖注入这一重要设计原则,并在实际项目中提升开发效率和代码质量。

    mybatis-guice-3.4.jar

    这个`mybatis-guice-3.4.jar`文件正是这个框架的一个版本,适用于初学者了解和学习如何在项目中集成MyBatis与Guice。 首先,我们来了解一下MyBatis。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及...

    Learning Google Guice

    标题《Learning Google Guice》指出本文档是关于学习谷歌Guice的,Guice是由谷歌开发的一个轻量级的依赖注入框架,其核心理念是简化Java应用程序中组件的创建和组装过程,通过依赖注入提高模块间的解耦,从而使得...

    guice-throwingproviders-3.2.1.zip

    1. **Google Guice**: 学习依赖注入的概念,理解如何通过注解配置和管理对象的生命周期,以及如何使用ThrowingProviders处理初始化异常。 2. **设计模式**:Guice框架应用了许多设计模式,如工厂模式、单例模式等,...

    Struts2与Guice(Guice3.0、Struts2.x)的整合(附demo)

    在提供的`struts2-guice`压缩包中,可能包含了实现以上步骤的示例代码,包括Struts2的配置文件、Guice模块、Action类等,供开发者参考和学习。通过这样的整合,开发者可以利用Guice的强大功能,让Struts2应用的代码...

Global site tag (gtag.js) - Google Analytics