Java/Guice/@Inject

1月 1, 2003 · Posted in Guice, Java · Comment 

概要

@Injectアノテーションを利用すると、フレームワークが各定義を参照し、実装クラスを必要なクラスにInjectする。
Guiceでは、コンストラクタインジェクション、セッターインジェクションなど、様々なパターンのInjectionを利用することができる。というより、すべてのメソッドを等価に扱う。

コード

import com.google.inject.Inject;

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

1月 1, 2003 · Posted in Guice, Java · Comment 

概要

同じタイプの複数の実装クラスがあるときに、それぞれのクラスにモジュール内で名前を付けておき、Injectする際に指定することで、任意のクラスをInjectさせることができる。

モジュール定義

binder.bind(IService.class)
.annotatedWith(Names.named("A"))
.to(ServiceA.class);

インジェクト指定

@Inject @Named("A")
private IService serviceA;

インタフェースIService

public interface IService {
public void print();
}

実装クラス1 ServiceA

public class ServiceA implements IService {
public void print() {
System.out.println("my name is a");
}
}

実装クラス2 ServiceB

public class ServiceB implements IService {
public void print() {
System.out.println("my name is b");
}
}

モジュールSampleModule

import com.google.inject.Binder;
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.Inject;
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.Guice;
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 a
my name is b

Java/Guice/@Singleton

1月 1, 2003 · Posted in Guice, Java · Comment 

実装クラスのデフォルトスコープの指定

特に指定を行わない場合、実行クラスはInjectされるたびに新しいインスタンスが生成される。
実行クラスに対して@Singletonアノテーションを指定することで、デフォルトの動作をSingletonにすることができる。

import com.google.inject.Singleton;

@Singleton
public class Service implements IService {
public void print() {
System.out.println("guice!");
}
}

次ページへ »