Dagger2入门系列二:Module&Component源码分析(2)

// .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()方法中。

总结:绘上一张Kakfa架构思维大纲脑图(xmind)

image

其实关于Kafka,能问的问题实在是太多了,扒了几天,最终筛选出44问:基础篇17问、进阶篇15问、高级篇12问,个个直戳痛点,不知道如果你不着急看答案,又能答出几个呢?

若是对Kafka的知识还回忆不起来,不妨先看我手绘的知识总结脑图(xmind不能上传,文章里用的是图片版)进行整体架构的梳理

梳理了知识,刷完了面试,如若你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

image

image

你还想进一步的深入学习解读kafka以及源码,那么接下来的这份《手写“kafka”》将会是个不错的选择。

  • Kafka入门

  • 为什么选择Kafka

  • Kafka的安装、管理和配置

  • Kafka的集群

  • 第一个Kafka程序

  • Kafka的生产者

  • Kafka的消费者

  • 深入理解Kafka

  • 可靠的数据传递

  • Spring和Kafka的整合

  • SpringBoot和Kafka的整合

  • Kafka实战之削峰填谷

  • 数据管道和流式处理(了解即可)

[外链图片转存中…(img-cnDNPkKI-1714284061266)]

[外链图片转存中…(img-EoYBbQtX-1714284061267)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
继“Java开发微信朋友圈PC版系统-架构1.0”之后,debug这段时间日撸夜撸,终于赶在春节放假前给诸位带来了这一系统的架构2.0版本,特此分享给诸位进行学习,以掌握、巩固更多的技术栈以及项目和产品开发经验,同时也为即将到来的金三银四跳槽季做准备! 言归正传,下面仍然以问答的方式介绍下本门课程的相关内容! (1)问题一:这是一门什么样的课程? 很明显,本门课程是建立在架构1.0,即 第1门课程 的基础上发布的,包含了架构1.0的内容,即它仍然是一门项目、产品实战课,基于Spring Boot2.X + 分布式中间件开发的一款类似“新浪微博”、“QQ空间”、“微信朋友圈”PC版的互联网社交软件,包含完整的门户网前端 以及 后台系统管理端,可以说是一套相当完整的系统! (2)问题:架构2.0融入了哪些新技术以及各自有什么作用? 本课程对应着系统架构2.0,即第2阶段,主要目标:基于架构1.0,优化系统的整体性能,实现一个真正的互联网社交产品;其中,可以学习到的技术干货非常多,包括:系统架构设计、Spring Boot2.X、缓存Redis、多线程并发编程、消息中间件RabbitMQ、全文搜索引擎Elastic Search、前后端消息实时通知WebSocket、分布式任务调度中间件Elastic Job、Http Restful编程、Http通信OKHttp3、分布式全局唯一ID、雪花算法SnowFlake、注册中心ZooKeeper、Shiro+Redis 集群Session共享、敏感词自动过滤、Java8 等等; A.  基于Elastic Search实现首页列表数据的初始化加载、首页全文检索;B.  基于缓存Redis缓存首页朋友圈“是否已点赞、收藏、关注、评论、转发”等统计数据;整合Shiro实现集群部署模式下Session共享;C.  多线程并发编程并发处理系统产生的废弃图片、文件数据;D.  基于Elastic Job切片作业调度分布式多线程清理系统产生的废弃图片;E.  基于RabbitMQ解耦同步调用的服务模块,实现服务模块之间异步通信;F.  基于WebSocket实现系统后端 与 首页前端 当前登录用户实时消息通知;G.  基于OKHttp3、Restful风格的Rest API实现ES文档、分词数据存储与检索;H.  分布式全局唯一ID 雪花算法SnowFlake实现朋友圈图片的唯一命名;I.  ZooKeeper充当Elastic Job创建的系统作业的注册中心;J.  为塑造一个健康的网络环境,对用户发的朋友圈、评论、回复内容进行敏感词过滤;K.  大量优雅的Java8  Lambda编程、Stream编程;  (3)问题三:系统运行起来有效果图看吗?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值