上一篇文章初略的实现一个Dagge2Demo 我自己昨完后 有这样一个想法 StudentModule 怎么产生出或者装不同的Pen对象呢 比如我想往StudentModule装入三支笔 分别为 红色的笔 白色的笔 黑色的笔 那该怎么办呢?通过网上查资料 我们只需要在 StudentModule 里 装入这三个对象 然后给每支笔取一个别名 我们使用这支笔的时候 根据它的别名去取就行了
首先是 怎么实现取别名
我们可以编写一个别名类 比如我此处 取名为 PenFiled; 注意此类的类型为 @interface
@Qualifier // 这个标识相当于取别名 注解帮助我们创建依赖的tag
@Retention(RetentionPolicy.RUNTIME) // 运行时注解
public @interface PenFiled { // 通过 penFiled字段定义别名
String value(); // 别名为String 类型
}
好了 现在我们可以同 PenFiled 来个笔取别名了 来看看我们这么给Pen取别名
@Module // 表明他是一个机器 他能生产创造出 东西来 你想创造的任何东西都可以友它来创造实现 比如此处我要生成出一支红色的笔 生产出的笔 可以提供给学生使用
public class StudentModule {
// 正常情况下的Pen
@Provides // 次标注表明 可以提供给外表使用 此处意为 可以提供给学生使用
Pen providePen() { // 固定格式 provide + class对象 如此处的Pen 所以变成方法名 providePen
return new Pen("红色");
}
// 定义 不同的 笔 并且取个别名 以便在 使用的地方通过别名来拿 新增加的内容
// 白色的笔 通过PenFile 给这支笔取了叫 whitePen的别名
@Provides @PenFiled("whitePen")
Pen provideWhitePen() {
return new Pen("白色");
}
//黑色的笔 通过PenFile 给这支笔取了叫 blackPen的别名
@Provides @PenFiled("blackPen")
Pen provideBlackPen() {
return new Pen("黑色");
}
}
这是我的上一篇文章中的 Pen类 后面的两个对象是我新增加的
别名取好接下来就是 怎么通过别名来拿到 不同别名的笔了
public class StudentActivity extends AppCompatActivity {
@Inject // 通过此 直接拿到机器帮你生产的产品 只要你自己的产品的构造方法标注此注解 并且也在生产机器中注册好了
Pen pen;
@Inject @PenFiled("whitePen") // 通过PenFiled 的whitePen 来拿到白色的笔 注意看 StudentModule里的取别名的对照
Pen wPen;
@Inject @PenFiled("blackPen") // 通过PenFiled 的blackPen 来拿到白色的笔 注意看 StudentModule里的取别名的对照
Pen bPen;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_student);
// DaggerStudentComponent 其实这才是 真正的组装机 连接到 生产机器 studentModule(new StudentModule()) 再连接到学生 inject(this) this 就是StudentActivity (学生)
DaggerStudentComponent.builder().studentModule(new StudentModule()).build().inject(this);
//好了 我们可以直接使用这支笔了 应为这支笔已经有 生成机器生产出来了 默认为红色的 我们toast 一下
Toast.makeText(StudentActivity.this, pen.getPenColor(), Toast.LENGTH_SHORT).show();
//接下来就是看你的表演了 定义更多的产品(class 对象) 让生产机器帮你生产(StudentModule 注意格式)
Log.e("dagger2","对象pen:" + pen.getPenColor() + ",对象 wPen:" + wPen.getPenColor() + ",对象 bPen:" + bPen.getPenColor());
}
}
看下效果