Android Dragger2快速入门浅析
定Dagger2的基本介绍:
dagger2是一个依赖注入框架,在编译期间自动生成代码,负责依赖对象的创建。
使用Dagger2的好处:
为了进一步解耦和方便测试,我们会使用依赖注入的方式构建对象 (不使用 new 来创建依赖对象)。在mvp中,presenter层会持有view和model层的依赖,依赖注入主要用于解耦,通过依赖注入创建对象,不再使用new来创建对象。
Dagger的常用注解:
@Inject
1.构造器注入(有多个构造器,只能标注其中一个)
2.属性注入(被注入的属性不能用private修饰)
3.方法注入(依赖需要this对象的时刻可以提供安全的this对象)
@Component
Dagger2是通过component来完成依赖注入的,一般定义component通常使用接口定义,用@Component注解。
两种定义方法:
void inject(目标类obj)
Dagger2会从目标类开始查找@Inject注解,自动生成依赖注入的代码,调用inject可完成依赖的注入。
Object getObj();
这种方式一般为其他Component提供依赖。
@Module
@module标记在类的上面
在@Component中指定Module(@Component = obj.class)
具体来说:此注解里面全是方法,用于对外提供对象,自己定义方法,方法上使用@Provides。自定义一个类,以Module结尾,用@Module注解。
@Provodes
@Provodes标记在方法的上面
@Qualifier和@Named
@Qualifier是限定符,而@Named则是基于String的限定符
当我有两个相同的依赖(都继承某一个父类或者都是先某一个接口)可以提供给高层时,那么程序就不知道我们到底要提供哪一个依赖,因为它找到了两个。
这时候我们就可以通过限定符为两个依赖分别打上标记,指定提供某个依赖。
@Qualifier不是直接注解在属性上的,而是用来自定义注解的。
不论是@Qualifier还是@Named必须成对出现,否则报错。
@PerActivity
限定对象的生命周期和Activity一样。一般应用于自定义的Component上。
@Singleton
标记为单例模式,如果在自定义Module中使用了此注解,在自定义的Component上也要使用该注解。
一个简单的DaggerDemo
我用的android studio的版本是3.13版本。
build.app(Module:app)的配置:
compileOnly 'org.glassfish:javax.annotation:10.0-b28'
implementation 'com.google.dagger:dagger:2.12'
annotationProcessor 'com.google.dagger:dagger-compiler:2.12'
首先创建一个实体类User:
public class User {
public String name;
public User(){
}
public User(String name){
this.name = name;
}
}
然后创建android MVP模式中的presenter:DaggerPresenter
public class DaggerPresenter {
DaggerActivity activity;
User user;
public DaggerPresenter(DaggerActivity activity,User user){
this.user = user;
this.activity = activity;
}
public void showUserName(){
activity.showUserName(user.name);
}
}
创建ActivityModule类
@Module
public class ActivityModule {
private DaggerActivity activity;
public ActivityModule(DaggerActivity activity){
this.activity = activity;
}
@Provides
public DaggerActivity provideActivity(){
return activity;
}
@Provides
public User provideUser(){
return new User("user from ActivityModule");
}
@Provides
public DaggerPresenter provideDaggerPresenter(DaggerActivity activity,User user){
return new DaggerPresenter(activity,user);
}
}
最后创建DaggerActivity
public class DaggerActivity extends AppCompatActivity {
private static final String TAG ="DaggerActivity";
TextView text;
@Inject
DaggerPresenter presenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = (TextView)findViewById(R.id.text);
inject();
presenter.showUserName();
}
private void inject(){
DaggerActivityComponent.builder().activityModule(new ActivityModule(this)).build().inject(this);
}
public void showUserName(String name){
text.setText(name);
}
}
然后布局文件就是一个TextView,运行成功后界面会显示user from ActivityModule.
Android Dragger2快速入门浅析的更多相关文章
- Android开发快速入门(环境配置、Android Studio安装)
Android是一种激动人心的开源移动平台,它像手机一样无处不在,得到了Google以及其他一些开放手机联盟成员(如三星.HTC.中国移动.Verizon和AT&T等)的支持,因而不能不加以学 ...
- Android游戏快速入门(一):基础储备
智能手机时代已经到来了,手机的性能正在以你我惊讶的速度提升.那么手机游戏也在迅速发展,从简单的平面单机游戏不断的向复杂的3D网络游戏发展.所以,手机游戏的市场肯定也在不断扩张.那么,作为程序猿,我们也 ...
- Hello, Android 快速入门
Hello, Android Android 开发与 Xamarin 简介 在这两节指南中,我们将 (使用 Xamarin Studio或 Visual Studio)建立我们的第一个 Xamarin ...
- Realm for Android快速入门教程
介绍 如果你关注安卓开发的最新趋势,你可能已经听说过Realm.Realm是一个可以替代SQLite以及ORMlibraries的轻量级数据库. 相比SQLite,Realm更快并且具有很多现代数据库 ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen快速上手
原文链接:Hello, Android Multiscreen Quickstart. 译文链接:Hello,Android Multiscreen快速上手 本部分介绍利用Xamarin.Androi ...
- android 开发从入门到精通
Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...
- c语言快速入门3
如果你想快速入门计算机,可以参考我的上一篇帖子,先了解一些必备的软知识,然后再来进行语言的快速入门 计算机入门基础知识 c语言快速入门1 c语言快速入门2 3.4.1 字符和字符串 字符:'' 单个 ...
- Swift语言快速入门
Swift语言快速入门(首部同步新版官方API文档和语法的Swift图书,确保代码可编译,作者专家在线答疑,图书勘误实时跟进) 极客学院 编著 ISBN 978-7-121-24328-8 201 ...
- html5快速入门(一)—— html简介
前言: 1.HTML5的发展非常迅速,可以说已经是前端开发人员的标配,在电商类型的APP中更是运用广泛,这个系列的文章是本人自己整理,尽量将开发中不常用到的剔除,将经常使用的拿出来,使需要的朋友能够真 ...
随机推荐
- IntelliJ IDEA导入多个eclipse项目到同一个workspace下
IntelliJ IDEA 与eclipse在新建项目上工作区的叫法略有不同,区别见下图. 我们在eclipse都是在新建的workspace目录下新建我们的项目,但是在IDEA中没有workspac ...
- android studio jni调用入门
一.开发环境配置: 1.Android Studio 2.3.3 2.android-ndk-r14b-windows-x86_64 二.创建项目 1.新建android项目 2.新建文件 3.编译生 ...
- C#基础篇九OOP属性结构枚举
1.设计一个Ticket类,有一个距离属性(本属性只读,在构造方法中赋值),不能为负数,有一个价格属性,价格属性只读,并且根据距离计算价格(1元/公里):-----------0-100公里 票价不打 ...
- hibernate对连接池的支持和HQL查询
hibernate对连接池的支持 连接池, 作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! 只维护一个连 ...
- @Async的使用
从Spring3.x 开始,加入@Async这个注解,用户异步线程处理,使用起来很方便. 使用配置如下:spring-task.xml <task:executor id="execu ...
- <Think Python>中斐波那契使用memo实现的章节
If you played with the fibonacci function from Section 6.7, you might have noticed thatthe bigger th ...
- Customizing docker
Customizing docker The Docker systemd unit can be customized by overriding the unit that ships with ...
- Spring中使用变量${}的方式进行参数配置
在使用Spring时,有些情况下,在配置文件中,需要使用变量的方式来配置bean相关属性信息,比如下面的数据库的连接使用了${}的方式进行配置,如下所示: <bean id="data ...
- new image的使用
在看别人的程序,用到了new image()这种方法,然而怎么看也不是很明白: 于是就上网搜,然而却没有一个人能够解开我心中的疑惑,因为没有一个人的程序是完整的, 即使我知道怎么用,但是我看不到效果就 ...
- Re:从零开始的Spring Session(二)
上一篇文章介绍了一些Session和Cookie的基础知识,这篇文章开始正式介绍Spring Session是如何对传统的Session进行改造的.官网这么介绍Spring Session: Spri ...