Java/Guice/@Inject
概要
@Injectアノテーションを利用すると、フレームワークが各定義を参照し、実装クラスを必要なクラスにInjectする。
Guiceでは、コンストラクタインジェクション、セッターインジェクションなど、様々なパターンのInjectionを利用することができる。というより、すべてのメソッドを等価に扱う。
コード
public class Client {
private IService constructorService;
private IService setterService;
private IService methodService;
@Inject
public Client(IService service) {
this.constructorService = service;
}
@Inject
public void setSetterService(IService service) {
this.setterService = service;
}
@Inject
public void methodService(IService service) {
this.methodService = service;
}
public void print() {
this.constructorService.print();
this.setterService.print();
this.methodService.print();
}
}
Java/Guice/@Named
概要
同じタイプの複数の実装クラスがあるときに、それぞれのクラスにモジュール内で名前を付けておき、Injectする際に指定することで、任意のクラスをInjectさせることができる。
モジュール定義
.annotatedWith(Names.named("A"))
.to(ServiceA.class);
インジェクト指定
private IService serviceA;
例
インタフェースIService
public void print();
}
実装クラス1 ServiceA
public void print() {
System.out.println("my name is a");
}
}
実装クラス2 ServiceB
public void print() {
System.out.println("my name is b");
}
}
モジュールSampleModule
import com.google.inject.Module;
import com.google.inject.name.Names;
public class SampleModule implements Module {
public void configure(Binder binder) {
binder.bind(IService.class)
.annotatedWith(Names.named("A"))
.to(ServiceA.class);
binder.bind(IService.class)
.annotatedWith(Names.named("B"))
.to(ServiceB.class);
}
}
クライアントクラスClient.java
import com.google.inject.name.Named;
public class Client {
@Inject @Named("A")
private IService serviceA;
@Inject @Named("B")
private IService serviceB;
public void print(){
serviceA.print();
serviceB.print();
}
}
実行
import com.google.inject.Injector;
public class Run {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new SampleModule());
Client client = injector.getInstance(Client.class);
client.print();
}
}
結果
my name is b
Java/Guice/@Singleton
実装クラスのデフォルトスコープの指定
特に指定を行わない場合、実行クラスはInjectされるたびに新しいインスタンスが生成される。
実行クラスに対して@Singletonアノテーションを指定することで、デフォルトの動作をSingletonにすることができる。
例
@Singleton
public class Service implements IService {
public void print() {
System.out.println("guice!");
}
}

