1.4、Activity类
public class Test1Activity extends AppCompatActivity {
@Inject
Student student;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test1);
ButterKnife.bind(this);
initDatas();
}
private void initDatas() {
DaggerTest1Component.builder()
// .test1Module(new Test1Module(this))
.build()
.inject(this);
}
@OnClick(R.id.btn1)
public void onViewClicked() {
Toast.makeText(this, student.toString(), Toast.LENGTH_SHORT).show();
}
}
2、源码解析
======
打开目录结构:
我们不难发现,编译器已经帮我们生成了这样几个文件:
-
Student_Factory
-
DaggerTest1Component
-
Test1Activity_MembersInjector
-
Test1Activity_ViewBinding(不用管,butterknife)
我们一一进行分析:
2.1、Student_Factory
上一篇文章我们已经进行了分析,很简单,当我们@Inject注解一个类的构造方法时,编译器会自动帮我们生成一个工厂类,负责生产该类的对象,类似于商品的厂家:
package com.gs.dagtest1.bean;
import dagger.internal.Factory;
public final class Student_Factory implements Factory {
private static final Student_Factory INSTANCE = new Student_Factory();
@Override
public Student get() {
return provideInstance();
}
public static Student provideInstance() {
return new Student();
}
public static Student_Factory create() {
return INSTANCE;
}
public static Student newStudent() {
return new Student();
}
}
2.2、DaggerTest1Component
public final class DaggerTest1Component implements Test1Component {
private DaggerTest1Component(Builder builder) {}
public static Builder builder() {
return new Builder();
}
public static Test1Component create() {
return new Builder().build();
}
@Override
public void inject(Test1Activity activity) {
injectTest1Activity(activity);
}
private Test1Activity injectTest1Activity(Test1Activity instance) {
Test1Activity_MembersInjector.injectStudent(instance, new Student());
return instance;
}
public static final class Builder {
private Builder() {}
public Test1Component build() {
return new DaggerTest1Component(this);
}
/**
-
@deprecated This module is declared, but an instance is not used in the component. This
-
method is a no-op. For more, see https://google.github.io/dagger/unused-modules.
*/
@Deprecated
public Builder test1Module(Test1Module test1Module) {
Preconditions.checkNotNull(test1Module);
return this;
}
}
}
2.3、Test1Activity_MembersInjector
public final class Test1Activity_MembersInjector implements MembersInjector {
private final Provider studentProvider;
public Test1Activity_MembersInjector(Provider studentProvider) {
this.studentProvider = studentProvider;
}
public static MembersInjector create(Provider studentProvider) {
return new Test1Activity_MembersInjector(studentProvider);
}
@Override
public void injectMembers(Test1Activity instance) {
injectStudent(instance, studentProvider.get());
}
public static void injectStudent(Test1Activity instance, Student student) {
instance.student = student;
}
}
很熟悉,我们在Activity中就用到了这个生成的类,编译器起名方式也很简洁:Dagger+你的Component接口名。
在我们的Activity中我们是这样使用:
DaggerTest1Component.builder()
// .test1Module(new Test1Module(this))
.build()
.inject(this);
我们根据这个步骤查看源码,发现
DaggerTest1Component.builder().build()
实际上是通过建造者模式创建了一个新的DaggerTest1Component对象而已。
然后通过调用
DaggerTest1Component.java
DaggerTest1Component.builder().build().inject(this);
@Override
public void inject(Test1Activity activity) {
injectTest1Activity(activity);
}
private Test1Activity injectTest1Activity(Test1Activity instance) {
Test1Activity_MembersInjector.injectStudent(instance, new Student());
return instance;
}
Test1Activity_MembersInjector.java
public static void injectStudent(Test1Activity instance, Student student) {
instance.student = student;
}
可以看到这些代码最终是把activity对象和student对象都 传入到了Test1Activity_MembersInjector的injectStudent()方法中。
2.4、Test1Activity_MembersInjector类,将Student和Activity进行连接
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
]
[外链图片转存中…(img-XF4edlpR-1715506875857)]
[外链图片转存中…(img-Jw59EcZC-1715506875858)]
[外链图片转存中…(img-u7GeGDKS-1715506875859)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!