注解自动生成dagger2 Component组件的工具

自己通过apt写的一个自动生成Component组件的注解工具,主要具有以下功能:

  • 生成Component组件,可指定一个或多个Module,可指定scope,并可以添加子组件(SubComponent)

  • 生成子组件SubComponent,并可指定Module,scope,父组件和子组件

  • 自动在组件中提供出子组件,并提供inject方法

  • 还能根据生成的组件,生成DaggerHelper帮助类,更方便的注入

注解种类:

  • GenRootComponent(int tag,int childTag,modules,scope)
    该注解用在哪个类上,就根据该类生成代码
    生成的Component被@Component注解
    参数含义:
    -tag 是自己的标识,tag一致的Component为同一组(主要用于父组件查找子组件,不填默认为0)
    -childTag 是子组件标识,工具会通过该标识来查找所有tag和此标识相等的SubComponent,并在本Component中提供出来
    -modules 该组件对应的Module(必填,一个或多个)
    -scope 该组件对应的scope(选填)
@GenRootComponent(scope = Singleton.class, modules = {AppModule.class}, tag = 10, childTag = 11)
public class App extends Application {
}

生成的代码

@Component(
    modules = AppModule.class
)
@Singleton
public abstract interface AppComponent extends MembersInjector<App> {
  BaseActivityComponent.Builder providerBaseActivityComponent();

  @Component.Builder
  abstract interface Builder {
    AppComponent build();

    Builder setModule(AppModule module);
  }
}
  • GenSubComponent(int tag,int childTag,modules,scope)
    该注解用在哪个类上,就根据该类生成代码
    生成的Component被@Subcomponent注解
    生成的Subcomponent依然可以有子组件注解
    参数含义:
    -tag 是自己的标识,tag一致的Component为同一组(主要用于父组件查找子组件,不填默认为0)
    -childTag 是子组件标识,工具会通过该标识来查找所有tag和此标识相等的SubComponent,并在本Component中提供出来
    -modules 该组件对应的Module(必填,一个或多个)
    -scope 该组件对应的scope(选填)
@GenSubComponent(modules = ActivityModule.class, tag = 12)
public class MainActivity extends BaseActivity {
}

生成的代码

@Subcomponent(
    modules = ActivityModule.class
)
public abstract interface MainActivityComponent extends 
//提供子组件
MembersInjector<MainActivity> {
  @Subcomponent.Builder
  abstract interface Builder {
    MainActivityComponent build();

    Builder setModule(ActivityModule module);
  }
}

  • @GenInheritedSubComponent(int tag,int childTag,modules,scope)
    有时可能需要在基类中注入需要的对象,这样的话,每一个该基类的实现类都需要生成Component,并注入该实现类,才能保证基类中的对象不为空,有时并不是每个Activity或Fragment都需要自己的Component,这时就可以用该注解,该注解适合使用在基类中,生成基类的Component,如果某一个实现类不需要Component,就可以使用基类的Component,并且通过该注解生成的Component,会提供所有没有自己的Component的实现类的inject()方法来注入自己(该步骤可在基类中完成)
    其他功能与GenSubComponent一致

参数含义:
-tag 是自己的标识,tag一致的Component为同一组(主要用于父组件查找子组件,不填默认为0)
-childTag 是子组件标识,工具会通过该标识来查找所有tag和此标识相等的SubComponent,并在本Component中提供出来
-modules 该组件对应的Module(必填,一个或多个)
-scope 该组件对应的scope(选填)

@GenInheritedSubComponent(tag = 11, childTag = 12, modules = BaseModule.class, scope = BaseScope.class,shouldInject = false)
public class BaseActivity extends AppCompatActivity

生成的代码

@Subcomponent(
    modules = BaseModule.class
)
@BaseScope
public abstract interface BaseActivityComponent {
//该Activity没有自己的Component,则提供注入方法
  void injectMembers(AppActivity target);

  SplashActivityComponent.Builder providerSplashActivityComponent();

  MainActivityComponent.Builder providerMainActivityComponent();

  @Subcomponent.Builder
  abstract interface Builder {
    BaseActivityComponent build();

    Builder setModule(BaseModule module);
  }
}
  • @GenDaggerHelper
    功能

  • 通过该注解,可以生成DaggerHelper辅助类(单例)提供注入方法

  • 该注解可使用在任何一个类上(主要为了提供一个包来存放该辅助类)

  • 生成的注入方法时分层级的,就是说,必须先注入该组件的父组件,才能注入该组件,不然会空指针(因为父组件还没获取到)

  • @GenInheritedSubComponent注解的基类的子类(没有自己的Component的子类)统一提供一个注入方法,会根据传入的类型,自动找到inject()方法来注入(也就是说可以在基类中注入)

  • 生成的注入方法对应的Module构造函数若有参数,则注入时也需要传入对应的参数

具体来看生产代码

public class DaggerHelper {
  public AppComponent appcomponent;

  private BaseActivityComponent baseactivitycomponent;

  private DaggerHelper() {
  }

  public static DaggerHelper getInstance() {
    return Holder.INSTANCE;
  }

  public AppComponent getAppComponent(App target, Application param0) {
    appcomponent = DaggerAppComponent.builder().setModule(new AppModule(param0)).build();
    appcomponent.injectMembers(target);
    return appcomponent;
  }

//因BaseModule()有参数,所以这里也需要传参(param0)
  public BaseActivityComponent getBaseActivityComponent(Object target, Activity param0) {
    baseactivitycomponent = appcomponent.providerBaseActivityComponent().setModule(new BaseModule(param0)).build();
    if(target instanceof AppActivity) {
      AppActivity appactivity = (AppActivity)target;
      baseactivitycomponent.injectMembers(appactivity);
    }
    return baseactivitycomponent;
  }

  public MainActivityComponent getMainActivityComponent(MainActivity target, Activity param0) {
    MainActivityComponent mainactivitycomponent = baseactivitycomponent.providerMainActivityComponent().setModule(new ActivityModule(param0)).build();
    mainactivitycomponent.injectMembers(target);
    return mainactivitycomponent;
  }

  public SplashActivityComponent getSplashActivityComponent(SplashActivity target) {
    SplashActivityComponent splashactivitycomponent = baseactivitycomponent.providerSplashActivityComponent().setModule(new SpashModule()).build();
    splashactivitycomponent.injectMembers(target);
    return splashactivitycomponent;
  }

  private static class Holder {
    private static final DaggerHelper INSTANCE = new DaggerHelper();
  }
}

库的介绍就到这里了,希望对大家有所帮助!!!

下面是项目地址:
注:项目中还有两个其他的注解工具,以后有时间再介绍

gradle:

 compile "com.suhang.lazy:lazyannotation_annotation:1.1.8"
 compile "com.suhang.lazy:lazyannotation:1.1.8"
 annotationProcessor "com.suhang.lazy:lazyannotation_compiler:1.1.8"

https://github.com/lightofrain/LazyAnnotation.git

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容