依赖注入框架之dagger2
主页: https://github.com/google/dagger
历史
*
Dagger1是由Square公司受到Guice(https://github.com/google/guice)启发创建的依赖注入框架.
*
Dagger2是Dagger1(https://github.com/square/dagger)的分支,由谷歌开发.该项目受到了Auto项目(https://github.com/google/auto)的启发
优点
* 没有使用反射,图的验证、配置和预先设置都在编译的时候执行
*
容易调试,完全具体地调用提供和创建的堆栈
*
更高的性能,谷歌声称他们提高了13%的处理性能
*
代码混淆,使用派遣方法,就如同自己写的代码一样
配置:
dependencies {
api 'com.google.dagger:dagger:2.15'
annotationProcessor 'com.google.dagger:dagger-compiler:2.15'
}
核心注解:
@Provides:
@Module:
@Component:
@Scope:

代码如下:
package com.loaderman.dagger2; import android.app.Application;
/* Provide 如果是单例模式 对应的Compnent 也要是单例模式
inject(Activity act) 不能放父类
即使使用了单利模式,在不同的Activity 对象还是不一样的
依赖component, component之间的Scoped 不能相同
子类component 依赖父类的component ,子类component的Scoped 要小于父类的Scoped,Singleton的级别是Application
多个Moudle 之间不能提供相同的对象实例
Moudle 中使用了自定义的Scoped 那么对应的Compnent 使用同样的Scoped * */
public class MyApp extends Application { private static AppComponent appComponent; @Override
public void onCreate() {
super.onCreate();
appComponent = DaggerAppComponent.builder().build();
} public static AppComponent getAppComponent() {
return appComponent;
}
}
package com.loaderman.dagger2; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import javax.inject.Scope; import static java.lang.annotation.RetentionPolicy.RUNTIME; @Scope
@Documented
@Retention(RUNTIME)
public @interface ActivityScoped {
}
package com.loaderman.dagger2; import javax.inject.Singleton; import dagger.Component;
//全局单例
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
AppApi getAppApi();
}
package com.loaderman.dagger2; import javax.inject.Singleton; import dagger.Module;
import dagger.Provides; @Module
public class AppModule { @Singleton
@Provides
AppApi providerAppApi() {
return new AppApi();
}
}
package com.loaderman.dagger2; import dagger.Component; //第一步 添加@Component
//第二步 添加module
//注意:如果 moudule所依赖的Comonent 中有被单例对象,那么Conponnent也必须是单例对象
//注意:子类component 依赖父类的component ,子类component的Scoped 要小于父类的Scoped,Singleton的级别是Application
@ActivityScoped
@Component(modules ={MainModule.class} ,dependencies = AppComponent.class)
public interface MainComponent {
//第三步 写一个方法 绑定Activity /Fragment
void inject(MainActivity activity);
void inject(TestActivity activity); }
package com.loaderman.dagger2; import javax.inject.Named; import dagger.Module;
import dagger.Provides; // @Named注解 可实例化对象不同
//第一步 添加@Module 注解
@Module
public class MainModule {
//第二步 使用Provider 注解 实例化对象
@Provides
User providerUserA() {
return new User();
} @Named("B")
@Provides
User providerUserB() {
return new User();
} //单例模式
@ActivityScoped
@Provides
MainApi providerMainApi() {
return new MainApi();
} @Provides
TestA providerTestA() {
return new TestA();
} }
package com.loaderman.dagger2;
public class AppApi {
}
package com.loaderman.dagger2;
public class MainApi {
}
package com.loaderman.dagger2;
public class TestA {
}
package com.loaderman.dagger2;
import javax.inject.Inject;
public class TestB {
@Inject
public TestB() {
}
}
package com.loaderman.dagger2;
public class User {
}
package com.loaderman.dagger2; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent;
import android.os.Bundle;
import android.view.View; import javax.inject.Inject; import dagger.Lazy; public class MainActivity extends AppCompatActivity {
@Inject
User userA;
@Inject
User userB;
@Inject
MainApi apiA;
@Inject
MainApi apiB;
@Inject
AppApi appApiA;
@Inject
AppApi appApiB;
@Inject
Lazy<TestA> testALazy;//懒加载机
@Inject
TestB testB;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainComponent
.builder()
//这里传入appComponent实例,我们可以通过application获取到
.appComponent(MyApp.getAppComponent())
.build()
.inject(this); System.out.println("-----------------输出--------------------------");
System.out.println("userA" + userA);
System.out.println("userB" + userB);
System.out.println("userA==userB? :" + (userA == userB));
//测试单例
System.out.println("apiA" + apiA);
System.out.println("apiB" + apiB);
System.out.println("apiA==apiB? :" + (apiA == apiB));
System.out.println("appApiA" + appApiA);
System.out.println("appApiB" + appApiB);
System.out.println("appApiA==appApiB? :" + (appApiA == appApiB));
System.out.println("testALazy" + testALazy);
TestA testA = testALazy.get();
System.out.println("testA" + testA);
//注解构造函数,创建实例
System.out.println("testB" + testB); } public void go(View view) {
startActivity(new Intent(this, TestActivity.class));
}
}
package com.loaderman.dagger2;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import javax.inject.Inject;
public class TestActivity extends AppCompatActivity {
@Inject
MainApi mainApi;
@Inject
AppApi api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
DaggerMainComponent.builder()
//这里传入appComponent实例,我们可以通过application获取到
.appComponent(MyApp.getAppComponent())
.build()
.inject(this);
System.out.println("-----------------输出--------------------------");
System.out.println("mainApi"+mainApi);
System.out.println("api"+api);
}
}
日志:
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: -----------------MainActivity输出--------------------------
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: userAcom.loaderman.dagger2.User@198c9ed7
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: userBcom.loaderman.dagger2.User@2a8f53c4
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: userA==userB? :false
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: apiAcom.loaderman.dagger2.MainApi@182492ad
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: apiBcom.loaderman.dagger2.MainApi@182492ad
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: apiA==apiB? :true
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: appApiAcom.loaderman.dagger2.AppApi@b1159e2
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: appApiBcom.loaderman.dagger2.AppApi@b1159e2
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: appApiA==appApiB? :true
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: testALazydagger.internal.DoubleCheck@26925173
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: testAcom.loaderman.dagger2.TestA@330fe830
12-26 15:16:03.000 15389-15389/com.loaderman.dagger2 I/System.out: testBcom.loaderman.dagger2.TestB@1ba4aca9
12-26 15:16:29.560 15389-15389/com.loaderman.dagger2 I/System.out: -----------------TestActivity输出--------------------------
12-26 15:16:29.560 15389-15389/com.loaderman.dagger2 I/System.out: mainApicom.loaderman.dagger2.MainApi@16e6aef2
12-26 15:16:29.560 15389-15389/com.loaderman.dagger2 I/System.out: apicom.loaderman.dagger2.AppApi@b1159e2
依赖注入框架之dagger2的更多相关文章
- [Android]依赖注入框架google的dagger
分享一下Android依赖注入框架--Google升级版Dagger2框架 Google的Dagger2是对上一版squareup的Dagger改版,话不多说直接上项目代码. Dagger2源码 Da ...
- [Android]依赖注入框架squareup的dagger
分享一下Android依赖注入框架--Dagger使用 Dagger源码 Dagger1-Demo 希望能给大家的开发带来帮助.
- Android Dagger依赖注入框架浅析
今天接触了Dagger这套android的依赖注入框架(DI框架).感觉跟Spring 的IOC差点儿相同吧.这个框架它的优点是它没有採用反射技术(Spring是用反射的),而是用预编译技术.因为基于 ...
- 依赖注入及AOP简述(四)——“好莱坞原则”和依赖注入框架简介 .
3.2. “好莱坞原则” 看了前面关于依赖注入概念的描述,我们来提炼出依赖注入的核心思想.如果说传统的组件间耦合方式,例如new.工厂模式等,是一种由开发者主动去构建依赖对象的话,那么依赖注入模 ...
- Ninject是一款.Net平台下的开源依赖注入框架
Ninject是一款.Net平台下的开源依赖注入框架.按照官方说法,它快如闪电.超级轻量,且充分利用了.Net的最新语法,使用Lambda表达式代替Xml文件完成类型绑定.Ninject结构精巧,功能 ...
- Dora.Interception,为.NET Core度身打造的AOP框架 [4]:与依赖注入框架的无缝集成
Dora.Interception最初的定位就是专门针对.NET Core的AOP框架,所以在整个迭代过程中我大部分是在做减法.对于.NET Core程序开发来说,依赖注入已经成为无处不在并且“深入骨 ...
- .net core程序中使用微软的依赖注入框架
我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...
- Spring.NET依赖注入框架学习--实例化容器常用方法
Spring.NET依赖注入框架学习---实例化容器常用方法 本篇学习实例化Spring.NET容器的俩种方式 1.通过XmlObjectFactory创建一个Spring.NET容器 IResour ...
- Spring.NET依赖注入框架学习--简单对象注入
Spring.NET依赖注入框架学习--简单对象注入 在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入 常 ...
随机推荐
- kubesphere-wokespaces
kubesphere - workspaces 详解: workspaces :企业空间 登陆kubesphere后,会看到一个默认的企业空间 " system-workspace &q ...
- 【网络协议】动态主机配置协议DHCP
动态主机配置协议DHCP 当某组织获得一块地址后,就可以为本组织内的主机或者路由器分配IP地址.这个分配工作可以由系统管理员手动通过网络管理工具来完成.也可以由动态主机配置协议(Dynamic Hos ...
- 给移动硬盘装win10,知道这些就足够了
随着制造工业的不断发展,储存介质逐渐廉价化,以某猫和某狗为代表的电商平台上都能轻松买到大容量的原装移动硬盘.如果工厂的产品还不能满足你的要求,那么DIY是一个不错的选择,可以选择购买移动硬盘盒(2.5 ...
- Linux 安装 wxPython4.0.4
Ubuntu 18.04 安装 wxPython4.0.4 因为 wxPython4.x 不提供 Linux 下的 bin 文件安装,以下记录 Ubuntu 18.04 的安装过程 (Ubuntu 1 ...
- Python中的字符串及其相关操作
1.表示: 字符串可以用单引号或者双引号括起来,两者效果是完全一样的. 针对较长的字符串,也可以用三个引号括起来,即"""..."""或者' ...
- PHP代码执行流程
怎么样?有点了解了么.说实话,单看这个,我本人是有点懵的,不过,不要怕.咱们来慢慢地看下. 首先,在网上找的信息说PHP代码执行的顺序是这样的,第一步是词法分析,第二步是语法分析,第三步是转化为opc ...
- jdbc连接数据库方式问题
1.使用service_name,配置方式:jdbc:oracle:thin:@//<host>:1521/net_grid 2.使用SID,配置方式:jdbc:oracle:thin:@ ...
- Mybatis XML配置(转载)
原文地址:https://www.w3cschool.cn/mybatis/f4uw1ilx.html Mapper XML 文件 MyBatis 的真正强大在于它的映射语句,也是它的魔力所在.由于它 ...
- JS 函数基础
函数简介 函数 函数也是一个对象 函数中可以封装一些功能(代码),在需要时可以指向这些功能(代码) 函数中可以保存一些代码在需要时调用 使用typeof检查一个函数对象时,会返回function 创建 ...
- 部署dashboard
1.获取k8s版本: 2.访问dashboard的github:https://github.com/kubernetes/dashboard/releases,然后找到对应的版本 3.然后将yaml ...