Dagger 2 injecting parameters of constructor

后端 未结 2 1059
野性不改
野性不改 2020-12-07 16:21

I saw the following example on the Dagger 2 website:

class Thermosiphon implements Pump {
  private final Heater heater;

  @Inject
  Thermosiphon(Heater he         


        
相关标签:
2条回答
  • 2020-12-07 17:03

    If you're using modules, then if you have two provider modules bound to the same component, then you'll be able to allow them to see the heater as a constructor parameter.

    @Module
    public class HeaterModule {
        @Provides
        @Singleton
        Heater heater() {
            return new Heater(); // if not using @Inject constructor
        }
    }
    
    @Module
    public class ThermosiphonModule {
        @Provides
        @Singleton
        Thermosiphon thermosiphon(Heater heater) {
            return new Thermosiphon(heater); // if not using @Inject constructor
        }
    }
    
    @Singleton
    @Component(modules={ThermosiphonModule.class, HeaterModule.class})
    public interface SingletonComponent {
        Thermosiphon thermosiphon();
        Heater heater();
    
        void inject(Something something);
    }
    
    public class CustomApplication extends Application {
        private SingletonComponent singletonComponent;
    
        @Override
        public void onCreate() {
            super.onCreate();
            this.singletonComponent = DaggerSingletonComponent.builder().build(); //.create();
        }
    
        public SingletonComponent getSingletonComponent() {
            return singletonComponent;
        }
    }
    

    But with constructor injection, you will also be able to provide objects of that given scope, or unscoped objects, as long as they have a @Inject constructor.

    For example,

    @Singleton
    @Component // no modules
    public interface SingletonComponent {
        Thermosiphon thermosiphon();
        Heater heater();
    
        void inject(Something something);
    }
    

    And

    @Singleton
    public class Heater {
        @Inject
        public Heater() {
        }
    }
    

    And

    @Singleton
    public class Thermosiphon {
        private Heater heater;
    
        @Inject
        public Thermosiphon(Heater heater) {
            this.heater = heater;
        }
    }
    

    Or

    @Singleton
    public class Thermosiphon {
        @Inject
        Heater heater;
    
        @Inject
        public Thermosiphon() {
        }
    }
    
    0 讨论(0)
  • 2020-12-07 17:04

    For one, since you've annotated the constructor of Thermosiphon with @Inject, you don't need an @Provides method. Dagger uses this constructor to create an instance when needed. Just annotate the Thermosiphon class itself with @Singleton to preserve the singleton behavior.

    If you do want to use an @Provides method, and to answer your question fully, you can specify the Heater as a parameter to the method:

    @Module
    public class ThermosiphonModule {
    
        @Provides
        @Singleton
        Thermosiphon provideThermosiphon(Heater heater) {
            return new Thermosiphon(heater);
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题