提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
导语:Dagger2
是基于 Java 注解
来实现依赖注入的,那么在正式使用之前我们需要先了解下 Dagger2 中的注解。Dagger2 使用过程中我们通常接触到的注解主要包括:@Inject
, @Module
, @Provides
, @Component
, @Qulifier
, @Scope
, @Singleten
。
提示:以下是本篇文章正文内容,下面案例可供参考
一、为什么需要Dagger2?
一般来说:如果两个类之间要进行依赖注入,基本一是考虑构造器的方式注入,二是set方式注入
/**
* 车引擎
*/
public class Engine {
public void inject(){
}
}
构造器的方式注入
/**
* 车
*/
public class Car {
Engine engine;
//第一种方式注入:构造器(以参数的方式传入)
public Car(Engine engine) {
this.engine = engine;
}
}
set方式注入
/**
* 车
*/
public class Car {
Engine engine;
//第二种方式注入:set方法(以参数的方式传入)
public void setEngine(Engine engine) {
this.engine = engine;
}
}
以上两种方式都是手动进行注入的,使用场景比较单一,不能适应多种情况,比如构造器要传入参数的时候,这就要修改其构造器,而Dagger2
框架正好就是为依赖注入而生的框架,能有效解决这方面的问题,IOC
是实现Dagger2
框架的核心>
- IOC框架的实现
-----动态:基于反射
的方式实现,Spring IOC
(在运行时动态
的进行依赖关系的建立)
------静态:程序在编译时期
已经建立好依赖关系的类(Dagger2
)
二、使用步骤
第一种方式注入:Inject
步骤1:在构造方法上使用Inject
注解,就是告知Dagger
可以通过构造方法来创建并获取User
实例(自己定义的实例对象)
/**
* Inject注解的简单使用
*/
public class User {
//步骤1:在构造方法上使用Inject注解,就是告知Dagger可以通过构造方法来创建并获取User实例
@Inject
public User(){
}
}
步骤2:创建一个接口,并使用Component
,然后创建一个方法把 依赖需求方(MainActivity
)
//@Component用于标记一个接口作为组件接口。组件接口是Dagger2用来连接依赖提供者(Modules)和依赖需求方(需要注入的对象)的桥梁。
@Component
public interface ApplicationComponent {
//步骤2:创建一个接口,并使用Component,然后创建一个方法把 依赖需求方(MainActivity) 和 依赖提供方(这里指的是User,还没用到Modules) 连接起来
void inject(MainActivity mainActivity);
}
重要:
//步骤3:在依赖需求方使用同样的注解Inject
//步骤4:依赖注入(这一步之前,ReBuild
一下)
public class MainActivity extends AppCompatActivity {
private static final String TAG="MainActivity";
//步骤3:在依赖需求方使用同样的注解Inject
@Inject
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//步骤4:依赖注入(这一步之前,ReBuild一下)
DaggerApplicationComponent.create().inject(this);
Log.d(TAG, "User的实例对象: "+user);
}
}
重要讲解:DaggerApplicationComponent
的生成规则:Dagger
是因为其框架,ApplicationComponent
是因为其接口命名方式,create
指的是创建,而inject
是接口中定义的方法
测试结果:
第二种方式注入:Module
步骤1:创建module
类,并通过Provides
注解获取 第三方框架
的实例
/**
* 步骤1:创建module类,并通过Provides注解获取 第三方框架 的实例
*/
//Module注解主要是为了将该类变成Dagger2框架中的模块,解决第三方框架提供实例的问题
@Module
public class NetModule {
//第二种方式注入:告知Dagger2可以提供该Provides注解获取到注入对象的实例
@Provides
public Retrofit providesRetrofit(){
return new Retrofit.Builder()
.baseUrl("http://baidu.com")
.build();
}
}
步骤2:在Component
接口组件中,加入modules = NetModule.class
,连接依赖提供者(Modules
)和依赖需求方(需要注入的对象MainActivity
)
//@Component用于标记一个接口作为组件接口。组件接口是Dagger2用来连接依赖提供者(Modules)和依赖需求方(需要注入的对象)的桥梁。
//步骤2:在Component接口组件中,加入modules = NetModule.class,连接依赖提供者(Modules)和依赖需求方(需要注入的对象MainActivity)
@Component(modules = NetModule.class)
public interface ApplicationComponent {
void inject(MainActivity mainActivity);
}
//步骤3:在依赖需求方使用同样的注解Inject
//步骤4:依赖注入(这一步之前,ReBuild
一下)
public class MainActivity extends AppCompatActivity {
private static final String TAG="MainActivity";
//步骤3:在依赖需求方使用同样的注解Inject
@Inject
Retrofit retrofit;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//步骤4:依赖注入(这一步之前,ReBuild一下)
DaggerApplicationComponent.create().inject(this);
Log.d(TAG, "Retrofit的实例对象: "+retrofit);
}
}
测试结果: