引入
project的build.gradle添加
dependencies {
... // 其他classpath
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加apt命令
}
module的build.gradle添加
// 添加其他插件
apply plugin:'com.neenbedankt.android-apt'//添加apt命令
dependencies {
apt 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器
compile 'com.google.dagger:dagger:2.0.2' //dagger公用api
provided 'org.glassfish:javax.annotation:10.0-b28' //添加android缺失的部分javax注解
}
注解
Ø @Inject:
Ø 通常在需要依赖的地方使用这个注解。换句话说,你用它告诉Dagger这个类或者字段需要依赖注入。这样,Dagger就会构造一个这个类的实例并满足他们的依赖。
Ø @Module:
Ø Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例
Ø 时候,就知道从哪里去找到需要的 依赖。modules的一个重要特征是它们设计为分区并组合在一起(比如说,
Ø 我们的app中可以有多个组成在一起的modules)
Ø @Provide:
Ø 在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。
Ø @Component:
Ø Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。 Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个接口然后列出所有的
案例
简单案例使用1:
public class MainActivity extends AppCompatActivity{
@Inject
ApiService apiService;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//builde之后出现的类
DaggerUserComponet.create().inject(this);
apiService.register();
}
}
@Component(modules ={UserModel.class} ) public interface UserComponet { void inject(MainActivity activity); }
@Module public class UserModel { @Provides public ApiService provideApiService(){ return new ApiService(); } }
public class ApiService { public ApiService(){ Log.d("ApiService","ApiService"); } public void register(){ Log.d("ApiService--User", "---------------ApiService" ); } }
进阶使用2;
public class MainActivity extends AppCompatActivity{
@Inject
UserManger userManger;
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerUserComponet.builder().userModel(new UserModel()).build().inject(this);//等价于DaggerUserComponet.create().inject(this);
userManger.register();
}
@Component(modules ={UserModel.class} )
public interface UserComponet {
void inject(MainActivityactivity);
}
@Module
public class UserModel {
// //方式一
// @Provides
// public ApiServiceprovideApiService(){
// return new ApiService();
// }
@Provides
public UserMangerprovideUserManger(ApiService apiService) {
return new UserManger(apiService);
}
}
public class UserManger {
private ApiService mApiService;
public UserManger(ApiService apiService){
mApiService =apiService;
}
public void register(){
mApiService.register();
}
}
public class ApiService {
private String TAG="ApiService";
//方式二
@Inject
public ApiService(){
Log.d("ApiService","ApiService");
}
public void register(){
Log.e(TAG, "---------------ApiService");
}
}
如果ApiService带参数的话
@Inject
public ApiService(Stringurl){
Log.d("ApiService","ApiService");
}
那么在UserModel中
@Provides
public String provideurl(){
return "www.baidu.com";
}