私はGuiceを動作させるように努めていますが、これで終わります:
クラスには、1つ(および1つのみ)のコンストラクターが必要です。
私のインターフェース:
public interface AddrBookStore {
public Contact getContactByKey(String key);
public void addContact(Contact c);
}
実装:
public class RdbmsBasedAddrBookStore implements AddrBookStore {
private Connection connection;
public RdbmsBasedAddrBookStore(Connection connection) {
this.connection = connection;
}
@Override
public Contact getContactByKey(String key) throws AddrBookException
{}
@Override
public void addContact(Contact c) throws AddrBookException
{}
}
バインディングモジュール:
public class ABguiceConfingModule extends AbstractModule {
@Override
protected void configure() {
bind(AddrBookStore.class).to(RdbmsBasedAddrBookStore.class);
}
}
私が注入しているAddrBook
クライアント:
public class AddrBook {
private AddrBookStore store;
@Inject
public AddrBook(AddrBookStore store)
{
this.store = store;
}
... other methods;
}
そして私のメイン:
public class App
{
public static void main( String[] args ) throws Exception
{
Injector injector = Guice.createInjector(new ABguiceConfingModule() );
AddrBookStore store = injector.getInstance( AddrBookStore.class );
AddrBook book = new AddrBook(store);
AddrBookCLI cli = new AddrBookCLI(book);
cli.interact(new InputStreamReader(System.in), new OutputStreamWriter(System.out));
}}
このすべての後、私はこのエラーを受け取ります:
1) Could not find a suitable constructor in addrbook.store.RdbmsBasedAddrBookStore. Classes must have either one (and only one) constructor annotated with @Inject or a zero-argument constructor that is not private.
[ERROR] at addrbook.store.RdbmsBasedAddrBookStore.class(RdbmsBasedAddrBookStore.Java:23)
[ERROR] at addrbook.ABguiceConfingModule.configure(ABguiceConfingModule.Java:13)
私は春の経験があり、Guiceの経験はありません。ここでどこがいけないのですか?
AddrBookStore
の主な依存関係が設定されていません。 Connection
のバインディングが必要であり、次にコンストラクタに@Inject
の注釈を付ける必要があります。AddrBookStore
クラスを設定しましたが、R [DB]をラップしています...Rdbms
を設定していない場合を除きます。
Guiceでこれを行う方法はたくさんありますが、この場合はおそらくProvider<Connection>
を使用して行います。これにより、データベースへの接続を開始するためのコードを配置するクラス全体ができるので、 :
public class ConnectionProvider implements Provider<Connection> {
public Connection get() {
// put your code that connects to the database here
}
}
それからあなたのモジュールは:
public class ABguiceConfingModule extends AbstractModule {
@Override
protected void configure() {
bind(AddrBookStore.class).to(RdbmsBasedAddrBookStore.class);
bind(Connection.class).toProvider(ConnectionProvider.class);
}
}
そして最後にAddrBookStore
:
public class RdbmsBasedAddrBookStore implements AddrBookStore {
private Connection connection;
@Inject
public RdbmsBasedAddrBookStore(Connection connection) {
this.connection = connection;
}
@Override
public Contact getContactByKey(String key) throws AddrBookException
{}
@Override
public void addContact(Contact c) throws AddrBookException
{}
}