簡體   English   中英

@Module在Dagger for Android中是什么意思?

[英]What does @Module means in dagger for android?

我讀過許多博客,但仍然無法弄清楚@Module注釋在@Module作用。 @Inject我得到它在運行時提供依賴項注入。 但是@Module是做什么的。 因為對象圖也是建立在模塊上的。

例如,我有來自https://github.com/AndroidBootstrap/android-bootstrap的這段代碼。

@Module(
    complete = false,

    injects = {
        BootstrapApplication.class,
        BootstrapAuthenticatorActivity.class,
        MainActivity.class,
        BootstrapTimerActivity.class,  
    }
)
public class BootstrapModule {
}

所以它基本上是做什么的。 因為我也試圖使用匕首作為@Module依賴項注入來構建一個應用程序,但是由於我無法清晰地獲取@Module概念,因此我只是被卡住了。

任何人都可以通過一些基本示例或概念來幫助我。 我認為這將對所有使用匕首的人有所幫助。

如果您查看注釋的文檔,則 @Module注釋的類將定義一個有助於匕首對象圖的類。 例如,在Spring框架中,等效項是@Configuration注釋。 它為對象圖定義了一個配置點,您可以在其中聲明希望可用於注入的對象及其作用域。

舉個簡單的例子,假設我們希望應用程序中的任何Activity使用單例對象 必須在模塊中創建它:

@dagger.Module(injects = {MyActivity.class})
public class Module {

    @Provides
    @Singleton
    public MySinletonBean provideMySingleton() {
        return new MySinletonBean();
    }

}

這將創建一個MySingleton對象,該對象可以注入MyActivity 這是一個非常基本的示例,但是我們可以在該圖中執行其他操作,例如在構造函數中使用依賴項:

@dagger.Module(injects = {MyActivity.class})
public class Module {

    private DependencyBean dependency = new DependencyBean();

    @Provides
    @Singleton
    public MySinletonBean provideMySingleton() {
        return new MySinletonBean(dependency);
    }

    @Provides
    @Singleton
    public MySinletonBean provideMyOtherSingleton() {
        return new MyOtherSinletonBean(dependency);
    }

}

然后,在MyActivity我們需要使用onCreate方法訪問該應用程序的圖形:

@Inject
MySingletonBean singleton;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity);
    ((MyApplication) getApplication()).getGraph().inject(this);
}

那么,誰在這里創建對象圖呢? 當您的應用程序啟動時, MyApplication類會執行此操作(不要偽造將其添加到androidManifest.xml ):

public class MyApplication extends Application {

    private ObjectGraph graph;

    public ObjectGraph getGraph() {
        return graph;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        graph = ObjectGraph.create(new Module(this));
        graph.inject(this);
    }

}

因此,匕首應用程序中的執行流程為:

  1. android應用程序啟動, MyApplication類構建圖形,解析@Module注釋的類並保留其實例。

  2. 然后,在模塊中聲明的類可以訪問其對象,只需將自身注入到對象圖中即可。 然后Gradle將評估其@Inject批注並執行依賴項注入。

我想注釋處理工具需要在編譯時生成代碼。 這使得Dagger不僅可以在運行時還可以在編譯時提供驗證。

暫無
暫無

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

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