- 一 最简单实现方式
1,需要一个model ,用来提供对象 使用@model来进行注解,提供对象的方法使用@Provides来进行注解
@Module
public class DataBaseModel {
@Provides
public DataBaseBean getDataBaseBean(){
return new DataBaseBean();
}
}
2,需要一个compoent组件来将对象注入到其它类中,这是一个接口,实现类会有系统帮我们生成;用标识符@Compoent来注解,通过modules来与需要的Model类链接,可以存放多个model类
通过自定义方法来进行注入
@Component(modules = { DataBaseModel.class})
public interface MyCompoent {
//注入到mainActivity中
void injectMain(MainActivity mainActivity);
}
3,使用
在Activity通过@Inject来对对象引用进行注解,通过creat或者build的方式进行创建,最简单方式完成
package com.example.dagger2demo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import com.example.dagger2demo.bean.DataBaseBean;
import com.example.dagger2demo.bean.HttpObject;
import com.example.dagger2demo.compoent.DaggerMyCompoent;
import com.example.dagger2demo.model.DataBaseModel;
import com.example.dagger2demo.model.LoginModel;
import javax.inject.Inject;
public class MainActivity extends AppCompatActivity {
@Inject
HttpObject httpObject;
@Inject
DataBaseBean dataBaseBean;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//简单直接创建方式
// DaggerMyCompoent.create().injectMain(this);
//另一种方式使用,可以对model进行传参
DaggerMyCompoent.builder()
.loginModel(new LoginModel())
.dataBaseModel(new DataBaseModel())
.build()
.injectMain(this);
Log.i("jett",httpObject.hashCode()+"");
Log.i("jett",dataBaseBean.hashCode()+"");
}
}
二,局部单例模式
1.需要在model 与compoent 加上关键字@Singleton
@Singleton
@Module
public class LoginModel {
//注解成单例模式
@Singleton
//注解方法对象
@Provides
public HttpObject getHttpObject(){
return new HttpObject();
}
}
@Singleton
@Component(modules = {LoginModel.class, DataBaseModel.class})
public interface MyCompoent {
void injectMain(MainActivity mainActivity);
}
如此,同一个activity中两个对象就是同一个hashCode
@Inject
HttpObject httpObject;
@Inject
HttpObject httpObject2;
局部单例只适用于同一个activity,因为注入的不同的activity会生成不同的compoent对象,
三 全局单例
1,将获取MyCompoent的方法放进Application中进行初始化,在Activity中直接获取该Conpoent,即可获取全局的单例对象
public class MyApplication extends Application {
private MyCompoent myCompoent;
@Override
public void onCreate() {
super.onCreate();
myCompoent = DaggerMyCompoent.builder()
.dataBaseModel(new DataBaseModel())
.loginModel(new LoginModel())
.build();
}
public MyCompoent getMyCompoent(){
return myCompoent;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
((MyApplication)getApplication()).getMyCompoent().injectMain(this);
}
四,多个Compoent同时使用
1,多个Compoent是不能同时注入到一个类中的,可以使用dependenices方式实现该功能,
@Singleton
@Component(modules = {LoginModel.class, DataBaseModel.class},
dependencies = {TestCompoent.class}
)
public interface MyCompoent {
void injectMain(MainActivity mainActivity);
void injectTest2(Test2Activity test2Activity);
}
@Component(modules = {TestModel.class})
public interface TestCompoent {
//不能使用这种依赖方式,会报错
// void injectMain(MainActivity mainActivity);
// void injectTest2(Test2Activity test2Activity);
public Test getTest();
}
//Application加入该Compoent
@Override
public void onCreate() {
super.onCreate();
myCompoent = DaggerMyCompoent.builder()
.dataBaseModel(new DataBaseModel())
.loginModel(new LoginModel())
.testCompoent(DaggerTestCompoent.create())
.build();
}
这种方式适用于test不是Singleton,如果都想时单例模式,这种方式会报错可以使用dependencies与scope结合使用的方式
/**
* 可以点击singleton 拷贝源码的方式书写这个类
*/
@Scope
@Documented
@Retention(RUNTIME)
public @interface AppScope {}
@Scope
@Documented
@Retention(RUNTIME)
public @interface UserScope {}
不同的compoent与对应的model 使用不同的scope
@UserScope
@Module
public class TestModel {
@UserScope
@Provides
public Test getTest(){
return new Test();
}
}
@UserScope
@Component(modules = {TestModel.class})
public interface TestCompoent {
//不能使用这种依赖方式,会报错
// void injectMain(MainActivity mainActivity);
// void injectTest2(Test2Activity test2Activity);
public Test getTest();
}
@AppScope
@Module
public class LoginModel {
//注解成单例模式
@AppScope
//注解方法对象
@Provides
public HttpObject getHttpObject(){
return new HttpObject();
}
}
/***
* 使用dependencies与scope 结合需注意
* 不同的Compoent上,Scope不能相同
* 没有scope的不能去依赖有scope的Compoent
*/
@AppScope
@Component(modules = {LoginModel.class, DataBaseModel.class},
dependencies = {TestCompoent.class}
)
public interface MyCompoent {
void injectMain(MainActivity mainActivity);
void injectTest2(Test2Activity test2Activity);
}
这样就可以实现了
源码下载地址:https://download.csdn.net/download/feng_zhongsha/16636455