為什么用Dagger2
Dagger2 是一款使用在Java和Android上的依賴(lài)注入的一個(gè)類(lèi)庫(kù)。是通過(guò)依賴(lài)注入讓你少些很多公式化代碼屈糊,更容易測(cè)試,降低耦合拌滋,創(chuàng)建可復(fù)用可互換的模塊(核心和ButterKnife類(lèi)似都是少寫(xiě)不必要的代碼,更加優(yōu)雅)功能很強(qiáng)大,不僅僅只是找個(gè)id實(shí)現(xiàn)個(gè)點(diǎn)擊,當(dāng)然學(xué)習(xí)難度也是非常大了,不過(guò)如果只是簡(jiǎn)單實(shí)用也是很簡(jiǎn)單,這篇博客只是Dagger2的簡(jiǎn)單介紹實(shí)用,很多高級(jí)的功能以后在寫(xiě)了,具體很簡(jiǎn)單也就5步
1.配置信息
Project的build.gradle文件修改
增加2行
//---dagger2-------
classpath 'me.tatarka:gradle-retrolambda:3.2.4'
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
//---dagger2-------
Module下的build.gradle添加以下內(nèi)容:
//---dagger2-------
apply plugin: 'com.neenbedankt.android-apt'
apply plugin: 'me.tatarka.retrolambda'
//---dagger2-------
android {
//---dagger2-------
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
//---dagger2-------
}
dependencies {
//---dagger2-------
apt 'com.google.dagger:dagger-compiler:2.4'
compile 'com.google.dagger:dagger:2.4'
provided 'org.glassfish:javax.annotation:10.0-b28'
//---dagger2-------
compile 'com.google.code.gson:gson:2.4'
}
2.Dagger2基本使用
核心如圖一共三部分
依賴(lài)實(shí)例,提供方法的類(lèi)(這個(gè)類(lèi)是可以注入到需要的地方,)在使用的地方之間使用這個(gè)類(lèi)的方法就ok
@Inject 表示UserManager會(huì)被注入
public class UserManager {
@Inject
UserManager() {}
public void test(final @NonNull Context context) {
Toast.makeText(context, "test", Toast.LENGTH_SHORT).show();
}
}
AppComponent是注入器,它一端連接目標(biāo)類(lèi)雌芽,另一端連接目標(biāo)類(lèi)依賴(lài)實(shí)例授艰,
@Singleton
@Component(modules = AppModule.class)
public interface AppComponent {
/**
* 需要用到這個(gè)連接器的對(duì)象,就是這個(gè)對(duì)象里面有需要注入的屬性
* (被標(biāo)記為@Inject的屬性)
* 這里inject表示注入的意思世落,這個(gè)方法名可以隨意更改淮腾,但建議就
* 用inject即可。
*/
void inject(Dagger2Activity obj);
}
目標(biāo)類(lèi)
public class Dagger2Activity extends AppCompatActivity {
//綁定TextView
@BindView(R.id.test)
TextView test;
@Inject
UserManager mUserManager;
@Inject
Gson g;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// 使用Dagger2生成的類(lèi) 生成組件進(jìn)行構(gòu)造,并注入
DaggerAppComponent.builder()
.build()
.inject(this);
}
@OnLongClick(R.id.test) //給 設(shè)置一個(gè)長(zhǎng)按事件
public boolean showToast2() {
mUserManager.test(this);
return true;
}
@OnClick(R.id.test)
public void showToast() {
List<Person> persons = new ArrayList<Person>();
for (int i = 0; i < 5; i++) {
Person p = new Person();
p.setName("name" + i);
p.setAge(i * 2);
persons.add(p);
}
Toast.makeText(this, g.toJson(persons), Toast.LENGTH_SHORT).show();
}
class Person {
private String name;
private int age;
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @param name the name to set
*/
public void setName(String name) {
this.name = name;
}
/**
* @return the age
*/
public int getAge() {
return age;
}
/**
* @param age the age to set
*/
public void setAge(int age) {
this.age = age;
}
@Override
public String toString()
{
return name + ":" +age;
}
}
備注
備注DaggerAppComponent是Dagger2生成的,自己新建的AppComponent注入器添加Dagger就可以,寫(xiě)完之后沒(méi)有這個(gè)類(lèi)需要Rebuild project或者先運(yùn)行一遍谷朝,AS會(huì)生成DaggerAppComponent就可以正常使用了
@Module
關(guān)于 @Inject Gson g;從哪里來(lái),為什么直接生成了gson
有時(shí)候我們并不能直接在構(gòu)造函數(shù)里面添加@Inject注解洲押,或者是我們?cè)陧?xiàng)目中引用第三方類(lèi)庫(kù)時(shí),也是無(wú)法直接在類(lèi)構(gòu)造函數(shù)中添加@Inject注解的圆凰,所以我們需要用到@Module注解了杈帐。這里的gso就是通過(guò)@Module注解獲取的
@Module
是用來(lái)生產(chǎn)實(shí)例來(lái)注入對(duì)象的,它類(lèi)似一個(gè)工廠专钉,集中創(chuàng)建要注入的類(lèi)的對(duì)象實(shí)例挑童。
@Module
public class AppModule {
@Provides
public Gson provideGson(){
return new Gson();
}
}
很簡(jiǎn)單的一個(gè)類(lèi)new Gson();生成的gson對(duì)象,提供給了目標(biāo)類(lèi)使用(備注provideGson這個(gè)名字可以隨便寫(xiě)但是最好自己能理解就可以)
在目標(biāo)類(lèi)里面直接共同@Inject Gson g;就可以獲取到gson了,別的就是正常使用
4最后
這里只是Dagger2的簡(jiǎn)單,使用,Dagger2功能很強(qiáng)大,所以要學(xué)的比較多,后續(xù)在寫(xiě)提高部分的了.