熟悉其他DI框架的同学应该知道,其实日常开发过程中,除了对象实例的依赖注入,有时还会遇到一些基本数据的依赖注入,本篇将介绍Dagger2在Android开发过程中如何进行基本数据的依赖注入。
我们直接进入主题,上代码:
package com.tc.app.dagger2.di;
import android.util.Log;
import javax.inject.Inject;
/**
* 真实的业务处理服务
*
* @author min.weixm
* @version $Id: MyBusinessApiService.java, v 0.1 2021/11/12 14:35 min.weixm Exp $
*/
public class MyBusinessApiService {
@Inject
String property;
@Inject
public MyBusinessApiService() {
}
public void register() {
Log.i("----------------------------MyBusinessApiService--------------------", "MyBusinessApiService " + property);
}
}
注:从上面代码可以看到,在MyBusinessApiService中,有个String类型的property属性,需要进行动态注入一个特定值。我们通过在register()打印日志的方式来检查property属性的注入过程是否成功。
接下来,我们开始为property属性进行设置:
package com.tc.app.dagger2.di;
import dagger.Module;
import dagger.Provides;
/**
* 在这里对实际进行业务处理的组件进行实例化(如,对MyBusinessApiService进行实例化处理)
*
* @author min.weixm
* @version $Id: MyBusinessApartModule.java, v 0.1 2021/11/12 14:38 min.weixm Exp $
*/
@Module
public class MyBusinessApartModule {
@Provides
public String property(){
return "http://www.baidu.com";
}
}
不失完整性,我们继续贴出Component和Activity的集成代码:
Component代码:
package com.tc.app.dagger2.di;
import com.tc.app.dagger2.MainActivity;
import dagger.Component;
/**
* 不真正提供实例,真实实例由 MyBusinessApartModule 提供
*
* @author min.weixm
* @version $Id: MyApartComponent.java, v 0.1 2021/11/12 14:40 min.weixm Exp $
*/
@Component(modules = {MyBusinessApartModule.class})
public interface MyApartComponent {
void inject(MainActivity activity);
}
Activity的集成代码:
package com.tc.app.dagger2;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import com.tc.app.dagger2.di.DaggerMyApartComponent;
import com.tc.app.dagger2.di.MyBusinessApiService;
import javax.inject.Inject;
public class MainActivity extends AppCompatActivity {
/** 通过依赖注入的业务服务实例 */
@Inject
MyBusinessApiService myBusinessApiService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = findViewById(R.id.fab);
fab.setOnClickListener((view) ->
Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
);
//初始化环境,并完成功能调用
DaggerMyApartComponent.create().inject(this);
this.myBusinessApiService.register();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
运行结果日志:
I/----------------------------MyBusinessApiService--------------------: MyBusinessApiService http://www.baidu.com
如果运行后,看到如上的日志记录,那么恭喜你,说明本次数据注入已经成功!