Guice系列之用户指南(九)

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

JustInTimeBindings(即时绑定):主要是在@ImplementedBy和@ProvidedBy实现。

贴代码:

import com.google.inject.ImplementedBy;

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

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

import com.google.inject.ProvidedBy;

@ProvidedBy(HumenProvider.class)
public interface Humen {
	void say();
}

import com.google.inject.Provider;

public class HumenProvider implements Provider<Humen> {
	@Override
	public Humen get() {
		Humen humen = new Student();
		System.out.println("Provider.get()");
		return humen;
	}
}

public class Student implements Humen {
	@Override
	public void say() {
		System.out.println("i am a student");
	}
}

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

public class Test {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector();
		Animal animal = injector.getInstance(Animal.class);
		System.out.println(animal.getClass().getSimpleName());
		animal.say();
		Humen humen = injector.getInstance(Humen.class);
		System.out.println(humen.getClass().getSimpleName());
		humen.say();
	}
}

执行结果:
Cat
i am a cat
Provider.get()
Student
i am a student

练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(九)

Guice系列之用户指南(八)

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

Built-in Bindings(内建的绑定):即时在injector内的绑定。例如Loggers等。

贴代码:

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

public class Test {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector();
		System.out.println(injector);
	}
}

执行结果:
Injector{bindings=[InstanceBinding{key=Key[type=com.google.inject.Stage, annotation=[none]], source=[unknown source], instance=DEVELOPMENT}, ProviderInstanceBinding{key=Key[type=com.google.inject.Injector, annotation=[none]], source=[unknown source], scope=Scopes.NO_SCOPE, provider=Provider}, ProviderInstanceBinding{key=Key[type=java.util.logging.Logger, annotation=[none]], source=[unknown source], scope=Scopes.NO_SCOPE, provider=Provider}]}

练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(八)

Guice系列之用户指南(七)

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

Constructor Bindings(构造器绑定):在父类型上绑定子类实现的构造函数。

贴代码:

public interface Animal {
	void say();
}

import com.google.inject.AbstractModule;

public class AnimalModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(String.class).toInstance("Tom");
		
		try {
			bind(Animal.class).toConstructor(Cat.class.getConstructor(String.class));
		} catch (NoSuchMethodException e) {
			addError(e);
		}
		
		System.out.println("run AnimalModule.configure()");
	}
}

public class Cat implements Animal {
	
	String name;
	
	public Cat(String name) {
		this.name = name;
		System.out.println("run Cat.constructor()");
	}
	
	@Override
	public void say() {
		System.out.println("i am a cat");
	}
	
	@Override
	public String toString() {
		return "name==>" + this.name;
	}
}

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());
		Animal cat = injector.getInstance(Animal.class);
		System.out.println(cat);
		cat.say();
	}
}

执行结果:
run AnimalModule.configure()
run Cat.constructor()
name==>Tom
i am a cat

练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(七)

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
继续阅读

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(六)

Guice系列之用户指南(五)

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

ProviderBindings(提供者绑定):就是实现Provider接口来生产依赖的对象。

贴代码:

public interface Animal {
	void say();
}

public class Cat implements Animal {
	
	String name;
	
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public void say() {
		System.out.println("i am a cat");
	}
	
	@Override
	public String toString() {
		return "name==>" + this.name;
	}
}

import com.google.inject.AbstractModule;

public class AnimalModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(String.class).toInstance("Tom");
		bind(Animal.class).toProvider(AnimalProvider.class);
		System.out.println("run configure");
	}
}

import com.google.inject.Inject;
import com.google.inject.Provider;

public class AnimalProvider implements Provider<Animal>{

	String name;
	
	@Inject
	public AnimalProvider(String name) {
		this.name = name;
	}
	
	public Animal get() {
		Cat cat = new Cat();
		cat.setName(name);
		System.out.println("run Provider.get()");
		return cat;
	}
}

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());
		AnimalProvider provider = injector.getInstance(AnimalProvider.class);
		Animal cat = provider.get();
		System.out.println(cat);
		cat.say();
	}
}

执行结果:
run AnimalModule.configure()
run Provider.get()
name==>Tom
i am a cat

练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(五)

Guice系列之用户指南(四)

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

@Provides Methods(@Provides注解方法):用@Provides来注解方法产生需要的对象。

贴代码:

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

public class Configure {
	
	String jdbcUrl;
	int loginTimeout;
	
	@Inject
	public Configure(@Named("JDBC URL") String jdbcUrl, 
			 int loginTimeout) {
		this.jdbcUrl = jdbcUrl;
		this.loginTimeout = loginTimeout;
	}
	
	@Override
	public String toString() {
		return "jdbcUrl==>" + this.jdbcUrl + "\tloginTimeout==>" + this.loginTimeout + " seconds";
	}
}

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

public class ConfigureModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(String.class)
	        .annotatedWith(Names.named("JDBC URL"))
	        .toInstance("jdbc:mysql://localhost/pizza");
	}

	@Provides
	int getLoginTimeout() {
		System.out.println("run @Provides");
		return 20;
	} 
}

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

public class Test {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new ConfigureModule());
		Configure configure = injector.getInstance(Configure.class);
		System.out.println(configure);
	}
}

执行结果:
run @Provides
jdbcUrl==>jdbc:mysql://localhost/pizza loginTimeout==>20 seconds

可以看到,在module里没有绑定int类型的值,却在依赖时注入了。

练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(四)

Guice系列之用户指南(三)

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

InstanceBindings(实例绑定):基本类型直接绑定值。

贴代码:

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

public class Configure {
	
	String jdbcUrl;
	int loginTimeout;
	
	@Inject
	public Configure(@Named("JDBC URL") String jdbcUrl, 
			@Named("login timeout seconds") int loginTimeout) {
		this.jdbcUrl = jdbcUrl;
		this.loginTimeout = loginTimeout;
	}
	
	@Override
	public String toString() {
		return "jdbcUrl==>" + this.jdbcUrl + "\tloginTimeout==>" + this.loginTimeout + " seconds";
	}
}

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

public class ConfigureModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(String.class)
	        .annotatedWith(Names.named("JDBC URL"))
	        .toInstance("jdbc:mysql://localhost/pizza");
		bind(Integer.class)
	        .annotatedWith(Names.named("login timeout seconds"))
	        .toInstance(10);		
	}

}

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

public class Test {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new ConfigureModule());
		Configure configure = injector.getInstance(Configure.class);
		System.out.println(configure);
	}
}

执行结果:
jdbcUrl==>jdbc:mysql://localhost/pizza loginTimeout==>10 seconds

练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(三)

Guice系列之用户指南(二)

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

BindingAnnotations(绑定注释):一个类型可能会有多个实现类,在绑定时加上注解,这样可以确定在依赖注入时用的具体是哪个实现类。
具体有2种,一种是自定义注解,另一种是@Named。

先看自定义注解,贴代码:

import com.google.inject.BindingAnnotation;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;

@BindingAnnotation 
@Target({FIELD, PARAMETER, METHOD }) 
@Retention(RUNTIME)
public @interface Tom {

}

public interface Animal {
	void say();
}

public class Cat implements Animal{

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

}

public class Dog implements Animal{

	@Override
	public void say() {
		System.out.println("i am a dog");
	}

}

public interface HelloService {
	void sayHello();
}

import com.google.inject.Inject;

public class HelloServiceImpl implements HelloService {

	Animal animal;
	
	@Inject
	public HelloServiceImpl(@Tom Animal animal) {
		this.animal = animal;
	}
	
	@Override
	public void sayHello() {
		System.out.println(animal.getClass().getSimpleName());
		animal.say();
	}
}

import com.google.inject.AbstractModule;

public class HelloServiceModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(Animal.class).annotatedWith(Tom.class).to(Cat.class);
		bind(Animal.class).to(Dog.class);
		bind(HelloService.class).to(HelloServiceImpl.class);
	}

}

public class Test {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new HelloServiceModule());
		HelloService helloService = injector.getInstance(HelloService.class);
		helloService.sayHello();
	}
}

执行结果:
Cat
i am a cat

当把HelloServiceImpl的构造函数里的@Tom去掉后,执行结果:
Dog
i am a dog

发现,多个实现类绑定到一个类型时,后者覆盖前者。
继续阅读

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(二)

Guice系列之用户指南(一)

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

LinkedBindings(链接绑定):在类型上绑定它的实现。

贴代码

public interface HelloService {
	void sayHello();
}

public class HelloServiceImpl implements HelloService {

	@Override
	public void sayHello() {
		System.out.println("hello");
	}

}

import com.google.inject.AbstractModule;

public class HelloServiceModule extends AbstractModule {

	@Override
	protected void configure() {
		bind(HelloService.class).to(HelloServiceImpl.class);
//		bind(HelloServiceImpl.class).to(SubHelloServiceImpl.class);
	}

}

public class Test {
	public static void main(String[] args) {
		Injector injector = Guice.createInjector(new HelloServiceModule());
		HelloService helloService = injector.getInstance(HelloService.class);
		System.out.println(helloService.getClass().getSimpleName());
		helloService.sayHello();
	}
}

执行结果:
HelloServiceImpl
hello

还可以写成绑定链,此时再添加个子类,

public class SubHelloServiceImpl extends HelloServiceImpl {

	@Override
	public void sayHello() {
		System.out.println("sub hello");
	}

}

然后,HelloServiceModule里注释打开。

执行结果:
SubHelloServiceImpl
sub hello

在写成绑定链时,injector返回该类型最终的实现类。

练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(一)

数据库事务浅析

数据库为什么要有事务,因为,事务是数据库区别于文件系统的特性之一。在文件系统中,如果你正在对2个文件进行修改,一个更新成功,另外一个在更新之前系统崩溃了,那么这就会有2个不同步的文件。

数据库中事务的基本作用就是将数据库从一种一致性状态转变为另外一种一致性状态。

数据库事务有4个特征(acid):
1.原子性(atomicity):事务中的所有动作要么都发生,要么都不发生。
2.一致性(consistency):事务将数据库状态从一种一致状态转变为下一种一致状态。
3.隔离性(isolation):一个事务的影响在该事务提交前对其他事务都不可见。
4.持久性(durability):事务一旦提交,其结果就永久性的。

继续阅读

发表在 数据库 | 标签为 | Comments Off on 数据库事务浅析