先来看个Demo
在MainActivity里面注入User
public class MainActivity extends Activity {
@Inject
User user;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//此类由dagger2框架生成
DaggerUserComponent.builder().build().inject(this);
Log.d("MainActivity", "User is " + user.toString);
}
}
public class User {
private String userName;
}
@Module
public class UserModule {
@Provides
User provideUser() {
return new User();
}
}
@Component(modules = {UserModule.class})
public interface UserActivityComponent {
void inject(MainActivity activity);
}
MainActivity被注入类,只要将对应变量加上@Inject注解,并在初始化调用dagger2生成的注入代码,如:DaggerUserComponent.builder().build().inject(this);
UserModule提供被注入的类的实例创建,用@Module注解,创建实例的方法用@Provides注解
UserActivityComponent这个为连接被注入类(MainActivity)和实例创建类(UserModule)的桥梁,@Component(modules = {UserModule.class})这个注解为连接过程
OK 以上是简单Demo介绍
Dagger2核心组件
@Inject
顾名思义就是注入,可以注入实例变量和构造方法,上面的Demo没有体现构造方法注入,等同于如下:
public class User {
private String userName;
//注解构造方法
@Inject
public User() {
}
}
//这里就不需要UserModule
@Component
public interface UserActivityComponent {
void inject(MainActivity activity);
}
有了注解构造方法后,这里的Component就不用提供UserModule了,因为框架会自动调用注解构造方法生成实例
@Module and @Provides
Module可以理解为一个工厂类,提供实例的创建,Provides用于标记提供示例创建的方法,比如上面的provideUser()方法。
@Component
它是一个接口,用于连接被注入的类和实例创建类,框架会根据此接口生成一系列模板代码,来实现整个注入流程。注解示例:@Component(modules = {UserModule.class})
@Scope
上面Demo中没有用到,但它非常有用,Scopes可是非常的有用,可以理解为注解作用域。Dagger2只提供了唯一的@Singleton,这里需要注意的是Component和Module中provides方法上的Scope必须相同,在Module的Scope是用在provide方法上,Component的Scope注解在类上,如下:
@Module
public class UserModule {
@Singleton
@Provides
User provideUser() {
return new User();
}
}
//Scope必须同Module
@Singleton
@Component(modules = {UserModule.class})
public interface UserActivityComponent {
void inject(MainActivity activity);
}
Dagger2的优点
-
解耦: 依赖注入独立于组件之外,注入的对象在一个独立、不耦合的地方初始化,这样在改变注入对象时,我们只需要修改对象的实现方法,而不用改上层代码。
-
灵活: 依赖可以注入到一个组件中:我们可以注入这些依赖的模拟实现,这样使得测试更加简单。
-
方便管理: 不需要知道有关实例创建和生命周期,这些由我们的依赖注入框架管理的。
Android里配置Dagger2
//在项目根目录的build.gradle添加classpath
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
//在module build.gradle添加插件
apply plugin: 'com.neenbedankt.android-apt'
//并添加依赖库
dependencies {
compile 'com.google.dagger:dagger:2.7'
apt 'com.google.dagger:dagger-compiler:2.7'
}
网友评论