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源码浅析的更多相关文章

  1. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  2. 【深入浅出jQuery】源码浅析2--奇技淫巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. Struts2源码浅析-ConfigurationProvider

    ConfigurationProvider接口 主要完成struts配置文件 加载 注册过程 ConfigurationProvider接口定义 public interface Configurat ...

  4. (转)【深入浅出jQuery】源码浅析2--奇技淫巧

    [深入浅出jQuery]源码浅析2--奇技淫巧 http://www.cnblogs.com/coco1s/p/5303041.html

  5. HashSet其实就那么一回事儿之源码浅析

    上篇文章<HashMap其实就那么一回事儿之源码浅析>介绍了hashMap,  本次将带大家看看HashSet, HashSet其实就是基于HashMap实现, 因此,熟悉了HashMap ...

  6. Android 手势识别类 ( 三 ) GestureDetector 源码浅析

    前言:上 篇介绍了提供手势绘制的视图平台GestureOverlayView,但是在视图平台上绘制出的手势,是需要存储以及在必要的利用时加载取出手势.所 以,用户绘制出的一个完整的手势是需要一定的代码 ...

  7. Android开发之Theme、Style探索及源码浅析

    1 背景 前段时间群里有伙伴问到了关于Android开发中Theme与Style的问题,当然,这类东西在网上随便一搜一大把模板,所以关于怎么用的问题我想这里也就不做太多的说明了,我们这里把重点放在理解 ...

  8. 【深入浅出jQuery】源码浅析2--使用技巧

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. Android手势源码浅析-----手势绘制(GestureOverlayView)

    Android手势源码浅析-----手势绘制(GestureOverlayView)

随机推荐

  1. MySQL 数据库字段类型使用说明

    简介 MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型. 数值类型 下列用于描述的代码字母中: M表示最大的显示尺寸.最大的合法的显示尺寸是 255 .(注 ...

  2. css清除浮动的3种方式

    前言: 当不给父元素设置宽高时,父元素的宽高会被子元素的内容撑开.但当子元素设置浮动属性(float) 后, 子元素会溢出到父元素外,父元素的宽高也不会被撑开,这称之为“高度塌陷”.可以理解为使用浮动 ...

  3. [Swift]LeetCode314. 二叉树的竖直遍历 $ Binary Tree Vertical Order Traversal

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  4. [Swift]LeetCode799. 香槟塔 | Champagne Tower

    We stack glasses in a pyramid, where the first row has 1 glass, the second row has 2 glasses, and so ...

  5. [Swift]LeetCode829. 连续整数求和 | Consecutive Numbers Sum

    Given a positive integer N, how many ways can we write it as a sum of consecutive positive integers? ...

  6. Python内置函数(54)——reversed

    英文文档: reversed(seq) Return a reverse iterator. seq must be an object which has a __reversed__() meth ...

  7. Python内置函数(29)——help

    英文文档: help([object]) Invoke the built-in help system. (This function is intended for interactive use ...

  8. qt集成dsoframer.ocx打开office办公软件

    最近一段时间真是事情太多了,前不久项目中一个嵌入office软件的问题,由于没有时间研究,且项目的需求是浏览word文档,偷了一个懒,把word文档转换成pdf文档,然后嵌入libcef浏览器给打开了 ...

  9. 使用ML.NET实现白葡萄酒品质预测

    导读:ML.NET系列文章 本文将基于ML.NET v0.2预览版,介绍机器学习中的分类和回归两个重要概念,并实现白葡萄酒品质预测. 本系列前面的文章也提到了一些,经典的机器学习最主要的特点就是模拟, ...

  10. git - 管理项目(SourceTree的使用)

    Git 相关命令操作全 1.SourceTree 是什么? SourceTree 是 Windows 和Mac OS X 下免费的 Git 和 Hg 客户端,拥有可视化界面,容易上手操作.同时它也是M ...