簡體   English   中英

Dagger2場注入不起作用

[英]Dagger2 Field Injection not working

我熟悉Spring依賴注入,但是Dagger2對我來說是新的。 我正在嘗試使一個簡單的Java應用程序正常工作,但是字段注入無效。

我有一個Main類,它依賴於MainBusiness類,而MainBusiness類又依賴於MainDao

MainBusiness被注入Main罰款,但MainDao沒有被注入MainBusiness並拋出NullPointerException

這里是MainDao實現的interface IMainDao

public class MainDao implements IMainDao
{       
    @Inject
    public MainDao()
    {
    }

    public String getResource()
    {
        return "This is the resource you are looking for";
    }
}

這里是MainBusiness實現IMainBusiness

public class MainBusiness implements IMainBusiness
{
    // package friendly field.  
    @Inject
    IMainDao mainDao;

    @Inject
    public MainBusiness()
    {
    }

    public String getResource()
    {       
        return mainDao.getResource(); // throws NPE here.
    }

}

這是AppModule

@Module
public class AppModule
{   
    /**
     * Provides a singleton instance of the MainDao 
     * 
     * @return
     */
    @Provides
    @Singleton
    public IMainDao providesMainDao()
    {
        return new MainDao();
    }

    /**
     * Provides a singleton instance of the MainBusiness Class
     * 
     * @return
     */
    @Provides
    @Singleton
    public IMainBusiness providesMainBusiness()
    {
        return new MainBusiness();
    }
}

AppComponent

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent
{

    /**
     * @param main
     */
    void inject(Main main); 
}

Main

public class Main
{   
    @Inject
    IMainBusiness mainBusiness;

    public Main()
    {
        AppComponent dac = DaggerAppComponent.builder().build();        
        dac.inject(this);       
    }

    public static void main(String args[])
    {
        Main main = new Main();     
        System.out.println(main.mainBusiness.getResource());
    }
}

它在MainBusiness.getResource(MainBusiness.java:14)上拋出NPE

我在這里想念什么? 感謝我可以獲得的任何幫助。

PS這是一個普通的Java應用程序。 這不是一個Android應用程序。

字段注入將注入您傳入的對象的字段someComponent.inject(someObject)隨后將注入someObject的字段,但不會過渡注入依賴項。 因此, MainBusiness仍將具有未初始化的DAO。

如果您調用new MainBusiness(); 自己,您不能指望Dagger會照顧好它。 您應該使用構造函數注入,而不要自己調用new 模塊用於綁定或其他設置,應減少自己調用所有構造函數的樣板。

我有一些自由可以切換到構造函數注入並完全刪除字段注入,因為在您的用例中不需要。 (也許有錯別字,我沒有編譯)

@Singleton
public class MainDao implements IMainDao
{       
    @Inject
    public MainDao()
    {
    }
}

@Singleton
public class MainBusiness implements IMainBusiness
{
    private IMainDao mainDao;

    @Inject
    public MainBusiness(IMainDao mainDao)
    {
        this.mainDao = mainDao;
    }
}

@Module
interface AppModule {

    @Binds IMainBusiness bindBusiness(MainBusiness impl);

    @Binds IMainDao bindDao(MainDao impl);

}

@Singleton
@Component(modules = {AppModule.class})
public interface AppComponent
{
    //  -> no reason not to use constructor injection here as well
    Main getMain(); // provision method
}

public class Main
{   

    private IMainBusiness mainBusiness;

    // favor constructor injection
    @Inject
    public Main(IMainBusiness mainBusiness)
    {
        this.mainBusiness = mainBusiness;
    }

    public static void main(String args[])
    {
        AppComponent component = DaggerAppComponent.builder().build()
        Main main = component.getMain();
        System.out.println(main.mainBusiness.getResource());
    }
}

我建議您再看看一些指南,以確保您理解這些概念,否則您可能會為自己創建更多不必要的工作。 我最近還寫了一篇文章,試圖消除對Dagger的誤解

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM