定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.