Dagger2

 前言

Dagger2是首个使用生成代码完整依赖注入的框架,极大减少了使用者的编码负担

1、简单的依赖注入

首先我们构建一个简单的android应用。我们创建一个UserModel,然后将他显示到TextView中。这里的问题是,一旦我们的UserModel的创建方式发生了改变,我们就需要修改创建UserModel的代码,而我们希望的是对于UserModel的修改不影响其他模块的代码(比如这里的MainActivity)

publicclassMainActivityextendsActionBarActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

UserModeluser =newUserModel();

((TextView) findViewById(R.id.user_desc_line)).setText(user.id +"\n"+ user.name +"\n"+ user.gender);

}

...

}

1.1构建依赖

我们搜先想到的是,将创建UserModel的代码独立出来,这样可以保证MainActivity的代码不被修改。dagger2中,这个负责提供以来的组件被称为Module(模块)。我们构建的ActivtyModule代码如下所示:

@Module

publicclassActivityModule{

@ProvidesUserModelprovideUserModel(){

returnnewUserModel();

}

}

可以看到,我们使用@Module标识类型为module,并用@Provides标识提供依赖的方法。

1.2 构建Injector(注射器)

有了提供依赖的组件,我们海域要将依赖注入到需要的对象中。该提供依赖对象的组件被成为injector。dagger2中,我们将其成为compoent(成分)。ActivityComponent代码如下:

@Component(modules = ActivityModule.class)

publicinterfaceActivityComponent{

voidinject(MainActivity activity);

}

可以看到,Component是一个使用@Component 标识的interace(接口)。interface的inject方法需要一个消费的类型对象作为参数。(消费的类型不可以携程其父类)

1.3 完成依赖注入

最后,我们需要在MainActivity中的构建Injector对象,完成注入。这部分代码如下:

publicclassMainActivityextendsActionBarActivity{

privateActivityComponentmActivityComponent;

@InjectUserModeluserModel;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mActivityComponent =DaggerActivityComponent.builder().activityModule(newActivityModule()).build();

mActivityComponent.inject(this);

((TextView) findViewById(R.id.user_desc_line)).setText(userModel.id +"\n"+ userModel.name +"\n"+ userModel.gender);

}

...

}

首先,我们使用@Inject标记被注入的对象userModel(注意userModule不能为private),之后通过dagger2生成的实现了我们提供的ActivityComponent创建component,调用其inject方法完成注入。至此,我们使用dagger实现了简单的依赖注入。

你可能感兴趣的:(Dagger2)