如何将生成的实现添加到Dagger依赖关系图?

时间:2015-04-07 17:21:41

标签: java android dagger annotation-processing dagger-2

我有一个界面

public interface SomeInterface { 
  void test(); 
}

和一个注释处理器,它生成一个名为SomeInterface的{​​{1}}实现。

要使用Dagger依赖注入使此类型可用,我将创建以下内容:

SomeInterfaceImpl

@Component(modules = {ApplicationModule.class})
@Singleton
public interface ApplicationComponent {    
    SomeInterface getSomeInterface();       
}

问题是我无法在ApplicationModule中使用use @Module public class ApplicationModule { @Provides @Singleton SomeInterface provideSomeInterface() { return new SomeInterfaceImpl(); } } ,因为它尚不可用,并且将由注释处理器生成。

如何扩展我的注释处理器以便我可以使用SomeInterfaceImpl进行Dagger依赖注入,并且生成的实现SomeInterface将被正确解析?

编辑:

该示例有效,但我想用另一个注释处理器创建ApplicationModule,让处理器以某种方式将ApplicationModule集成到匕首图中。 @Component(modules = {ApplicationModule.class})将不存在,因为我不知道在代码中将生成ApplicationModule。有没有办法将生成的@Module类集成到Dagger图中?请注意,我不想猜测将生成ABCModule并将其添加到@Component。我希望这会以某种方式自动发生。

1 个答案:

答案 0 :(得分:0)

只要注释都在同一个javac调用中,并且只要你最终在其中一个处理器轮次中生成你的类,Dagger应该推迟尝试使用该符号直到后一轮。

但是,在上面提到的特定情况下,Dagger的处理器甚至不会直接尝试访问SomeInterfaceImpl,因为它位于@Provides的正文中方法和注释处理器不能(通过公共API)访问方法体内容。所以Dagger甚至不应该关心SomeInterfaceImpl是否及时生成 - 但是如果你在最后一轮之前没有生成,那么Dagger生成的代码可能无法编译(模块本身也不会)。