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. 基于ipv6的数据抓包

    一.实验拓扑 二.配置过程 以r1为例 R1: R1(config)#int f0/0 R1(config-if)#ipv6 enable R1(config-if)#ipv6 address 200 ...

  2. Python内置函数(41)——max

    英文文档: max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item in an i ...

  3. 网络协议 8 - TCP协议(上):性恶就要套路深

    系列文章: 网络协议 1 - 概述 网络协议 2 - IP 是怎么来,又是怎么没的? 网络协议 3 - 从物理层到 MAC 层 网络协议 4 - 交换机与 VLAN:办公室太复杂,我要回学校 网络协议 ...

  4. java代码之美(4)---guava之Immutable(不可变)集合

    Immutable(不可变)集合 一.概述 guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开.Collections是jdk提供的一个工具类 ...

  5. TP3.2框架中的字母函数解析

    C的使用方法以及注意事项 使用方法: 1.读取配置 C('参数名称')  配置参数不区分大小写,存在则设置,否则返回NULL; 因为配置参数是全局有效的,因此C方法可以在任何地方读取任何配置,即使某个 ...

  6. 『追捕盗贼 Tarjan算法』

    追捕盗贼(COCI2007) Description 为了帮助警察抓住在逃的罪犯,你发明了一个新的计算机系统.警察控制的区域有N个城市,城市之间有E条双向边连接,城市编号为1到N. 警察经常想在罪犯从 ...

  7. AngularJS7那些不得不说的事故

    题外话   最近简直要忙死,所以停更了很久,你们会不会以为我人间蒸发了?   正文之前,请允许我先跑个题,就是关于忙的问题.   做了Freelance,每天过的比上班还累,这完全不是我想要的生活啊? ...

  8. arrays.xml中使用integer-array引用drawable图片资源,代码中如何将这些图片资源赋值到ImageView控件中

    当我们在arrays.xml文件中声明一些图片资源数组的时候: <?xml version="1.0" encoding="utf-8"?> < ...

  9. [Leetcode]695. Max Area of Island

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  10. StackExchange.Redis .net core Timeout performing 超时问题

    最近在做的一个项目,用的.net core 2.1,然后缓存用的Redis,缓存相关封装是同事写的,用的驱动是StackExchange.Redis version 2.0.571 ,一直听说这个驱动 ...