1. androidstudio中Dagger2环境搭建
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注解
}
2.简单实例
用户登录界面
ui界面 LoginActivity中代码
public class LoginActivity extends AppCompatActivity implements
ILoginView,View.OnClickListener{
@Bind(R.id.et_name)
EditText etName;
@Bind(R.id.et_password)
EditText etPassword;
@Bind(R.id.btn_login)
Button btnLogin;
@Bind(R.id.btn_clear)
Button btnClear;
@Inject
LoginPresenterCompl loginPresenter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_login);
ButterKnife.bind(this);
DaggerMainComponent.builder().mainModule(new MainModule(this)).build().inject(this);
// loginPresenter = new LoginPresenterCompl(this);//不引入dagger2时生成的p实例
}
@OnClick({R.id.btn_login, R.id.btn_clear})
public void onClick(View view) {
String name = etName.getText().toString().trim();
String password = etPassword.getText().toString().trim();
switch (view.getId()) {
case R.id.btn_login:
loginPresenter.doLogin(name,password);
break;
case R.id.btn_clear:
loginPresenter.clear();
break;
}
}
@Override
public void onClearText() {
etName.setText("");
etPassword.setText("");
Toast.makeText(this, "登录信息被清除了", Toast.LENGTH_SHORT).show();
}
@Override
public void onLoginResult(Boolean result, int code) {
if (result){
Toast.makeText(this, "登录成功"+code, Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "登录失败"+code, Toast.LENGTH_SHORT).show();
}
}
}
ILoginView中code
public interface ILoginView {
public void onClearText();
public void onLoginResult(Boolean result, int code);
}
ILoginPresenter中的code
public interface ILoginPresenter {
public void clear();
public void doLogin(String name, String password);
}
LoginPresenterCompl中的code
public class LoginPresenterCompl implements ILoginPresenter {
private ILoginView loginView;
private User user;
@Inject
public LoginPresenterCompl(ILoginView loginView) {
this.loginView = loginView;
user = new User("zhangsanfeng", "123");
}
@Override
public void clear() {
loginView.onClearText();
}
@Override
public void doLogin(String name, String password) {
boolean result = false;
int code = 0;
if (name.equals(user.getName())&& password.equals(user.getPassword())) {
result=true;
code = 1;
}else{
result = false;
code = 0;
}
loginView.onLoginResult(result,code);
}
}
User模型
public class User {
private String name;
private String password;
public User(String name, String password) {
this.name = name;
this.password = password;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
MainModule
@Module
public class MainModule {
private final ILoginView view;
public MainModule(ILoginView view) {
this.view = view;
}
@Provides
ILoginView provideILoginView(){
return view;
}
}
MainComponent
@Component (modules = MainModule.class)
public interface MainComponent {
void inject(LoginActivity activity);
}
- @Inject 程序会将Dagger2会将带有此注解的变量或者构造方法参与到依赖注入当中,Dagger2会实例化这个对象
- @Module 带有该注解的类需要对外提供依赖,其实就是提供实例化需要的参数,Dagger2在实例化的过程中发现一些参数,Dagger2就会到该类中寻找带有@Provides注解的以provide开头的需找对应的参数
- @Component 带有该注解的接口或抽象类起到一个关联桥梁的作用,作用就是将带有@Inject的方法或对象和带有@Module的类进行关联,只有通过该接口或抽象类才可以在实例化的时候到带有@Module中类中去寻找需要的参数,也就是依赖注入
整个demo的基本思路:
- 在这个示例代码中,LoginActivity中需要LoginPresenterCompl,所以在LoginActivity中定义了该对象并且通过@Inject将其注解,同时到LoginPresenterCompl的构造方法中也通过@Inject将其注解, 表明这些是需要依赖注入的.
- 因为在LoginPresenterCompl的构造方法需要ILoginView类型的参数,所以需要通过依赖将获取这些参数,所以就需要带有@Module注解的类用于获取需要的参数, 在@Module注解的类中通过被@Provides注解的以provide开头的方法对外提供需要的参数,一般而言有几个参数就需要有几个带有@Provides的方法。
- 此时还需要一个桥梁将两者联系到一起,带有@Component的接口或抽象类就起到这个桥梁的作用。注解中有一个module的值,这个值指向需要依赖的Module类,同时其中有一个抽象方法 inject(),其中的参数就是我们需要在哪个类中实例化LoginPreserentCompl,因为我们需要在LoginActivity中实例化,所以参数类型就是LoginActivity类型。 然后在Android studio中rebuild我们的项目,就会生成DaggerMainComponent类,通过
DaggerMainComponent.builder().mainModule(new MainModule(this)).build().inject(this);
完成我们需要的依赖注入。