guice初体验
guice是Google开源的轻量级依赖注入框架。
maven依赖
<dependency>
<groupId>com.google.inject</groupId>
<artifactId>guice</artifactId>
<version>4.0</version>
</dependency>
<dependency>
<groupId>com.google.inject.extensions</groupId>
<artifactId>guice-multibindings</artifactId>
<version>4.0</version>
</dependency>
第一个demo
HelloPrinter.java
import javax.inject.Singleton;
@Singleton
public class HelloPrinter {
public void print() {
System.out.println("Hello, World");
}
}
Sample.java
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import javax.inject.Singleton;
@Singleton
public class Sample {
@Inject
private HelloPrinter printer;
public void hello() {
printer.print();
}
public static void main(String[] args) {
Injector injector = Guice.createInjector();
Sample sample = injector.getInstance(Sample.class);
sample.hello();
}
}
第二个demo
HelloPrinterInterface.java
import com.google.inject.ImplementedBy;
//@ImplementedBy(SimpleHelloPrinter.class)
public interface HelloPrinterInterface {
void print();
}
import javax.inject.Singleton;
@Singleton
public class SimpleHelloPrinter implements HelloPrinterInterface {
@Override
public void print() {
System.out.println("Hello, Simple World");
}
}
import javax.inject.Singleton;
@Singleton
public class ComplexHelloPrinter implements HelloPrinterInterface {
@Override
public void print() {
System.out.println("Hello, Complex World");
}
}
SampleModule.java
import com.google.inject.AbstractModule;
import com.google.inject.multibindings.MapBinder;
import com.google.inject.multibindings.Multibinder;
import com.google.inject.name.Names;
public class SampleModule extends AbstractModule {
@Override
protected void configure() {
//bind(HelloPrinterInterface.class).to(ComplexHelloPrinter.class);
bind(HelloPrinterInterface.class).annotatedWith(Names.named("simple"))
.to(SimpleHelloPrinter.class);
bind(HelloPrinterInterface.class).annotatedWith(Names.named("complex"))
.to(ComplexHelloPrinter.class);
Multibinder<HelloPrinterInterface> printerSets = Multibinder
.newSetBinder(binder(), HelloPrinterInterface.class);
printerSets.addBinding().to(SimpleHelloPrinter.class);
printerSets.addBinding().to(ComplexHelloPrinter.class);
MapBinder<String, HelloPrinterInterface> printerMaps = MapBinder
.newMapBinder(binder(), String.class, HelloPrinterInterface.class);
printerMaps.addBinding("simple").to(SimpleHelloPrinter.class);
printerMaps.addBinding("complex").to(ComplexHelloPrinter.class);
}
}
Sample.java
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.google.inject.name.Named;
import javax.inject.Singleton;
import java.util.Map;
import java.util.Set;
@Singleton
public class Sample {
@Inject
@Named("complex")
private HelloPrinterInterface printer;
@Inject
private Set<HelloPrinterInterface> printerSets;
@Inject
private Map<String, HelloPrinterInterface> printerMaps;
public void hello() {
printer.print();
}
public void helloSet() {
for (HelloPrinterInterface printer : printerSets) {
printer.print();
}
}
public void helloMap() {
for (String key : printerMaps.keySet()) {
printerMaps.get(key).print();
}
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new SampleModule());
Sample sample = injector.getInstance(Sample.class);
sample.hello();
sample.helloSet();
sample.helloMap();
}
}