Dagger2源码浅析
dagger2是目前android端比较火的一款依赖注入框架,先来看下基本的用法吧:
首先提供module,类似于工厂:
@Module
public class ApiServiceModule {
private static final String ENDPOINT = "";
@Singleton
@Provides
public OkHttpClient providerOkHttpClient(){
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setConnectTimeout(60 * 1000, TimeUnit.MILLISECONDS);
okHttpClient.setReadTimeout(60 * 1000, TimeUnit.MILLISECONDS);
return okHttpClient;
}
@Singleton
@Provides
public RestAdapter providerRestAdapter(OkHttpClient okHttpClient){
RestAdapter.Builder builder = new RestAdapter.Builder();
builder.setClient(new OkClient(okHttpClient))
.setEndpoint(ENDPOINT);
return builder.build();
}
@Singleton
@Provides
public ApiService providerApiService(RestAdapter adapter){
return adapter.create(ApiService.class);
}
}
然后是component组件,用来连接module与需求方:
@Singleton
@Component(modules = {AppModule.class , ApiServiceModule.class , AppServiceModule.class})
public interface AppComponent {
Application getApplication();
ApiService getService();
User getUser();
}
在activity中使用:
public class MainActivity extends BaseActivity {
private TextView tvName;
@Inject
MainPresenter mMainPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvName = findViewById(R.id.tvName);
mMainPresenter.showUserName();
}
@Override
protected void setupActivityComponent(AppComponent appComponent) {
DaggerMainActivityComponent.builder()
.appComponent(appComponent)
.mainActivityModule(new MainActivityModule(this))
.build().inject(this);
}
public void setTextName(String name){
tvName.setText(name);
}
}
使用是非常简单的,下面来看一下dagger2是如何做到依赖注入的吧:
首先会调到 DaggerMainActivityComponent.builder() ,我们会想到构建者模式,一起看下源码
public static Builder builder() {
return new Builder();
}
Builder的构造函数中没有做任何处理,接下来看下.build方法:
public MainActivityComponent build() {
if (mainActivityModule == null) {
throw new IllegalStateException(
MainActivityModule.class.getCanonicalName() + " must be set");
}
if (appComponent == null) {
throw new IllegalStateException(AppComponent.class.getCanonicalName() + " must be set");
}
return new DaggerMainActivityComponent(this);
}
new DaggerMainActivityComponent(this) 会初始化component,然后将builder传递进去,这也是建造者模式的一般写法,下面看下其中的构造函数会执行哪些方法呢
private void initialize(final Builder builder) {
this.providerMainActivityProvider =
DoubleCheck.provider(
MainActivityModule_ProviderMainActivityFactory.create(builder.mainActivityModule));
this.getUserProvider =
new com_winning_mvp_dagger2_retrofit_master_di_component_AppComponent_getUser(
builder.appComponent);
this.providerMainPresenterProvider =
DoubleCheck.provider(
MainActivityModule_ProviderMainPresenterFactory.create(
builder.mainActivityModule, providerMainActivityProvider, getUserProvider));
}
下面我们来单独看一下这句
this.providerMainActivityProvider =
DoubleCheck.provider(
MainActivityModule_ProviderMainActivityFactory.create(builder.mainActivityModule));
走到MainActivityModule_ProviderMainActivityFactory中看一下:
public final class MainActivityModule_ProviderMainActivityFactory implements Factory<MainActivity> {
private final MainActivityModule module;
public MainActivityModule_ProviderMainActivityFactory(MainActivityModule module) {
this.module = module;
}
@Override
public MainActivity get() {
return provideInstance(module);
}
public static MainActivity provideInstance(MainActivityModule module) {
return proxyProviderMainActivity(module);
}
public static MainActivityModule_ProviderMainActivityFactory create(MainActivityModule module) {
return new MainActivityModule_ProviderMainActivityFactory(module);
}
public static MainActivity proxyProviderMainActivity(MainActivityModule instance) {
return Preconditions.checkNotNull(
instance.providerMainActivity(),
"Cannot return null from a non-@Nullable @Provides method");
}
}
现在component中的属性都是有值的了,最后看下inject做了哪些操作:
public static void injectMMainPresenter(MainActivity instance, MainPresenter mMainPresenter) {
instance.mMainPresenter = mMainPresenter;
}
到这里依赖注入就已经完成了,这里只是分析了最简单的注入方式。

Dagger2源码浅析的更多相关文章
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- Struts2源码浅析-ConfigurationProvider
ConfigurationProvider接口 主要完成struts配置文件 加载 注册过程 ConfigurationProvider接口定义 public interface Configurat ...
- (转)【深入浅出jQuery】源码浅析2--奇技淫巧
[深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html
- HashSet其实就那么一回事儿之源码浅析
上篇文章<HashMap其实就那么一回事儿之源码浅析>介绍了hashMap, 本次将带大家看看HashSet, HashSet其实就是基于HashMap实现, 因此,熟悉了HashMap ...
- Android 手势识别类 ( 三 ) GestureDetector 源码浅析
前言:上 篇介绍了提供手势绘制的视图平台GestureOverlayView,但是在视图平台上绘制出的手势,是需要存储以及在必要的利用时加载取出手势.所 以,用户绘制出的一个完整的手势是需要一定的代码 ...
- Android开发之Theme、Style探索及源码浅析
1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...
- 【深入浅出jQuery】源码浅析2--使用技巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- Android手势源码浅析-----手势绘制(GestureOverlayView)
Android手势源码浅析-----手势绘制(GestureOverlayView)
随机推荐
- [Swift]LeetCode331. 验证二叉树的前序序列化 | Verify Preorder Serialization of a Binary Tree
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, ...
- [Swift]LeetCode782. 变为棋盘 | Transform to Chessboard
An N x N board contains only 0s and 1s. In each move, you can swap any 2 rows with each other, or an ...
- linux下crontab的使用
在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep cron].cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间.cron的配置文件称为“cr ...
- Netty:ChannelInitializer
1. 作用 用于在某个Channel注册到EventLoop后,对这个Channel执行一些初始化操作.ChannelInitializer虽然会在一开始会被注册到Channel相关的pipeline ...
- 像素数据YUV简介与觉存储格式介绍
主要学习链接:博客园.51CTO 前言 照例是先废话几句,下面的内容都是在学习时从网上找来的,并非我原创,我之所以要写这篇笔记是因为网的内容都很分散,找的时候要从各个地方看,很不方便,所以就自己总结了 ...
- JVM基础系列第3讲:到底什么是虚拟机?
我们都知道在 Windows 系统上一个软件包装包是 exe 后缀的,而这个软件包在苹果的 Mac OSX 系统上是无法安装的.类似地,Mac OSX 系统上软件安装包则是 dmg 后缀,同样无法在 ...
- asp.net core 系列 15 中间件
一.概述 中间件(也叫中间件组件)是一种装配到应用管道以处理请求和响应的软件. 每个组件:(1)选择是否将请求传递到管道中的下一个组件;(2)可以在管道中的下一个组件之前和之后执行工作. 请求委托用于 ...
- 贝叶斯个性化排序(BPR)算法小结
在矩阵分解在协同过滤推荐算法中的应用中,我们讨论过像funkSVD之类的矩阵分解方法如何用于推荐.今天我们讲另一种在实际产品中用的比较多的推荐算法:贝叶斯个性化排序(Bayesian Personal ...
- 阿里云Ubuntu安装图形界面与中文语言包
图形界面: http://blog.csdn.net/qq_37608398/article/details/78155568?locationNum=9&fps=1 安装中文: http:/ ...
- angr进阶(3) 添加约束
如果已知字符串长度或部分,可以使用如下的方式进行格式规范csaw_wyvern 1 flag_chars = [claripy.BVS('flag_%d' % i, 8) for i in range ...