Guice系列之用户指南(六)

原文地址:https://code.google.com/p/google-guice/wiki/UntargettedBindings

UntargettedBindings(没有目标的绑定):就是在module里绑定时不需要明确实现类,结合用@ImplementedBy或者@ProvidedBy实现。区别绑定的注解时要加上实现类的类型,即使是父类型。

贴代码:

import com.google.inject.ImplementedBy;

@ImplementedBy(value = Cat.class)
public interface Animal {
	void say();
}

import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
import com.google.inject.name.Names;

public class AnimalModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(Animal.class)
			.annotatedWith(Names.named("Tom"))
			.to(Animal.class)
			.in(Singleton.class);
		System.out.println("run AnimalModule.configure()");
	}
}

public class Cat implements Animal {
	@Override
	public void say() {
		System.out.println("i am a cat");
	}
}

import javax.inject.Named;
import com.google.inject.Inject;

public class CatWrapper {
	
	Animal animal;
	
	@Inject
	private CatWrapper(@Named("Tom") Animal animal) {
		System.out.println("CatWrapper.Contructor()");
		this.animal = animal;
	}
	
	public void say() {
		animal.say();
	}
	
	public Animal getAnimal() {
		return this.animal;
	}
}

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Test {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new AnimalModule());
		
		CatWrapper wrapper1 = injector.getInstance(CatWrapper.class);
		System.out.println(wrapper1);
		System.out.println(wrapper1.getAnimal());
		
		CatWrapper wrapper2 = injector.getInstance(CatWrapper.class);
		System.out.println(wrapper2);
		System.out.println(wrapper2.getAnimal());
	}
}

执行结果:
run AnimalModule.configure()
CatWrapper.Contructor()
com.zoo.guice.userguide.chap6.p1.CatWrapper@8fce95
com.zoo.guice.userguide.chap6.p1.Cat@143c8b3
CatWrapper.Contructor()
com.zoo.guice.userguide.chap6.p1.CatWrapper@12d7a10
com.zoo.guice.userguide.chap6.p1.Cat@143c8b3

上面这种是@ImplementedBy加上注解绑定的,后面也跟上了to,下面这种是@ProvidedBy实现。

import com.google.inject.ProvidedBy;

@ProvidedBy(value = AnimalProvider.class)
public interface Animal {
	void say();
}

import com.google.inject.AbstractModule;
import com.google.inject.Singleton;

public class AnimalModule2 extends AbstractModule {

	@Override
	protected void configure() {
		bind(Animal.class).in(Singleton.class);
		System.out.println("run AnimalModule.configure()");
	}
}

import com.google.inject.Provider;

public class AnimalProvider implements Provider<Animal>{

	public Animal get() {
		System.out.println("run Provider.get()");
		return new Cat();
	}
}

public class Cat implements Animal {
	@Override
	public void say() {
		System.out.println("i am a cat");
	}
}

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Test2 {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new AnimalModule2());
		Animal cat_A = injector.getInstance(Animal.class);
		System.out.println(cat_A);
		Animal cat_B = injector.getInstance(Animal.class);
		System.out.println(cat_B);
	}
}

执行结果:
run AnimalModule.configure()
run Provider.get()
com.zoo.guice.userguide.chap6.p2.Cat@18ee9d6
com.zoo.guice.userguide.chap6.p2.Cat@18ee9d6

练习代码在这里

此条目发表在编程语言分类目录,贴了, 标签。将固定链接加入收藏夹。