热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dagger2使用(四)一个简单的Dagger依赖注入过程

实例为一个简单的Android应用,使用AndroidStudio;创建了一个BookModel,在activity中使用TextView显示该BookModel信息。

        实例为一个简单的Android应用,使用AndroidStudio;创建了一个BookModel,在activity中使用TextView显示该BookModel信息。

        未使用Dagger的常规实现如下:

public class TestDaggerMainActivity extends BaseActivity {
TextView mShowInfoView;
BookModel mBook;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_dagger_main);
//
initDatas();
initViews();
showBookinfo();
}

private void initDatas() {
mBook = new BookModel("testBook", 25);
}

private void initViews() {
mShowInfoView = (TextView)findViewById(R.id.showBookInfo_view);
}
private void showBookinfo() {
mShowInfoView.setText(mBook.toString());
}
}


        BookModel.java的定义:

public class BookModel {
private String name;
private float price;

public BookModel() {
}
public BookModel(String name, float price) {
this.name = name;
this.price = price;
}
//getter setter省略
@Override
public String toString() {
return "[" + name + "\t" + price + "元]";
}
}

1.  配置build.gradle

        1)需要配置apt插件,没有这插件,dagger可能不会正常工作,特别是在Android studio中。

        2)需要配置“ javax.annotation”,Dagger2中会用到@Generated注解,而javax.anotation.generated在Android API 中没有。

apply plugin: 'android-apt'

//
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}

//dependencies中的配置
//for dagger2
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.google.dagger:dagger:2.0'
// Dagger2中会用到@Generated注解,而javax.anotation.generated在Android API 中是没有.
compile 'org.glassfish:javax.annotation:10.0-b28'

 

2.     构建依赖

        Dagger2中,这个负责提供依赖的组件被称为Module。使用@Module标识类型为module,并用@Provides标识提供依赖的方法。

        构建的ActivityModule代码如下所示。

@Module
public class ActivityModule {
@Provides
BookModel provideUserModel() {
return new BookModel("testBook", 25);
}
}

 

3.     构建Injector

        连接提供依赖和消费依赖对象的组件被称为Injector;Dagger2中,我们将其称为Component。

        Component是一个使用@Component标识的Javainterface。interface的inject方法需要一个消耗依赖的类型对象作为参数。

        注意:这里必须是真正消耗依赖的类型TestDaggerMainActivity(实际的消耗依赖的类),而不可以写成其父类等。

        ActivityComponent代码如下,代码编译后,会自动生成实现类“DaggerActivityComponent”,在构建依赖注入时需要用到。

@Component(modules = ActivityModule.class)
public interface ActivityComponent {
void inject(TestDaggerMainActivity activity);
}

 

4.     完成依赖注入

        在TestDaggerMainActivity中构建Injector对象,完成注入。

        注:BookModel mBook 不能定义为private。注:BookModel mBook 不能定义为private。

public class TestDaggerMainActivity extends BaseActivity {
private ActivityComponent mActivityComponent;
TextView mShowInfoView;
//
@Inject
BookModel mBook;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_dagger_main);
//
initDatas();
initViews();
showBookinfo();
}

private void initDatas() {
//构建Injector对象及完成注入
mActivityCompOnent= DaggerActivityComponent.builder()
.activityModule(new ActivityModule()).build();
mActivityComponent.inject(this);
}

private void initViews() {
mShowInfoView = (TextView)findViewById(R.id.showBookInfo_view);
}
private void showBookinfo() {
mShowInfoView.setText(mBook.toString());
}
}



推荐阅读
author-avatar
归向大海_651
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有