我有一个界面
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。我希望这会以某种方式自动发生。
答案 0 :(得分:0)
只要注释都在同一个javac调用中,并且只要你最终在其中一个处理器轮次中生成你的类,Dagger应该推迟尝试使用该符号直到后一轮。
但是,在上面提到的特定情况下,Dagger的处理器甚至不会直接尝试访问SomeInterfaceImpl
,因为它位于@Provides
的正文中方法和注释处理器不能(通过公共API)访问方法体内容。所以Dagger甚至不应该关心SomeInterfaceImpl
是否及时生成 - 但是如果你在最后一轮之前没有生成,那么Dagger生成的代码可能无法编译(模块本身也不会)。