7
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Inject;
import com.google.inject.Injector;

public class GuiceDemo
{
    public static void main(String[] args)
    {
        new GuiceDemo().run();
    }

    public void run()
    {
        Injector injector = Guice.createInjector(new EmptyModule());
        DemoInstance demoInstance = injector.getInstance(DemoInstance.class);
        assert(demoInstance.demoUnbound == null);
    }

    public static class EmptyModule extends AbstractModule
    {
        @Override
        protected void configure()
        {
        }
    }

    public static class DemoInstance
    {
        public final DemoUnbound demoUnbound;

        @Inject
        public DemoInstance(DemoUnbound demoUnbound)
        {
            this.demoUnbound = demoUnbound;
        }
    }

    public static class DemoUnbound
    {
    }
}

GuiceがDemoInstanceのコンストラクターにDemoUnboundのインスタンスを提供するのを防ぐことはできますか?

本質的に、私はGuiceを完全に明示的なバインディングモードで実行する方法を探しています。このモードでは、バインドされていないクラスの挿入がエラーになります。

モジュールにバインドされていないクラスをGuiceが注入するのをどのようにエラーにしますか?

4

2 に答える 2

12

モジュールを入れbinder().requireExplicitBindings();てみてください。具体的なクラスを挿入することを妨げることはありませんが、bind(DemoUnbound.class);それをより明確にするために含めるモジュールが必要になります。

詳細については、バインダーのドキュメントをお読みください。

于 2012-09-18T03:54:46.940 に答える
6

If you use an interface here instead of a concrete class for DemoUnbound, Guice will throw an exception because it cannot find a suitable class to inject:

public class GuiceDemo
{
    public static void main(String[] args)
    {
        new GuiceDemo().run();
    }

    public void run()
    {
        Injector injector = Guice.createInjector(new EmptyModule());
        DemoInstance demoInstance = injector.getInstance(DemoInstance.class);
        assert(demoInstance.demoUnbound == null);
    }

    public static class EmptyModule extends AbstractModule
    {
        @Override
        protected void configure()
        {
        }
    }

    public static class DemoInstance
    {
        public final DemoUnbound demoUnbound;

        @Inject
        public DemoInstance(DemoUnbound demoUnbound)
        {
            this.demoUnbound = demoUnbound;
        }
    }

    public interface DemoUnbound
    {
    }
}
于 2012-09-17T23:39:39.927 に答える