使用范围:当某个module被多个对象使用的时候使用。
1.component声明module
@Component(modules = MainModel.class)
public interface ActivityComponent {
void inject(MainActivity activity);
void inject(Main2Activity activity);
}
2.module中声明方法:
@Module
@Module
public class MainModel {
public MainModel(){
Log.d("打印","不错"+this.getClass().getName());
}
@Named("testUrl")
@Provides
public String provideUrl() {
return "this is url";
}
@Named("testName")
@Provides
public String provideName() {
return "this is name";
}
}
3.调用注入方法:
public class MainActivity extends AppCompatActivity {
@Named("testUrl")
@Inject
String url;
@Named("testName")
@Inject
String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerActivityComponent.builder().build().inject(this);
Log.d("打印","1不错"+url);
Log.d("打印","1不错"+name);
startActivity(new Intent(this,Main2Activity.class));
}
}
public class Main2Activity extends AppCompatActivity {
@Named("testUrl")
@Inject
String url;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
DaggerActivityComponent.builder().build().inject(this);
Log.d("打印","2不错"+url);
}
}
打印结果:
2019-04-16 18:13:23.262 6987-6987/yang.shuai.mydagger D/打印: 不错yang.shuai.mydagger.MainModel
2019-04-16 18:13:23.262 6987-6987/yang.shuai.mydagger D/打印: 1不错this is url
2019-04-16 18:13:23.262 6987-6987/yang.shuai.mydagger D/打印: 1不错this is name
2019-04-16 18:13:23.535 6987-6987/yang.shuai.mydagger D/打印: 不错yang.shuai.mydagger.MainModel
2019-04-16 18:13:23.535 6987-6987/yang.shuai.mydagger D/打印: 2不错this is url
分析自动生成代码:
DaggerMainComponent中包含:
MainModel_ProvideUrlFactory、MainModel_ProvideNameFactory、MainActivity_MembersInjector、Main2Activity_MembersInjector
//根据方法名为module中每个方法都建立一个factory,并为每个activity创建一个注入类
private void initialize(final Builder builder) {
this.provideUrlProvider = MainModel_ProvideUrlFactory.create(builder.mainModel);
this.provideNameProvider = MainModel_ProvideNameFactory.create(builder.mainModel);
this.mainActivityMembersInjector =
MainActivity_MembersInjector.create(provideUrlProvider, provideNameProvider);
this.main2ActivityMembersInjector = Main2Activity_MembersInjector.create(provideUrlProvider);
}
//注入MainActivity
@Override
public void inject(MainActivity activity) {
mainActivityMembersInjector.injectMembers(activity);
}
//注入Main2Activity
@Override
public void inject(Main2Activity activity) {
main2ActivityMembersInjector.injectMembers(activity);
}
MainModel_ProvideUrlFactory、MainModel_ProvideNameFactory代码,主要提取对应的值:
public final class MainModule_ProvideUrlFactory implements Factory<String> {
...
//根据。
@Override
public String get() {
return Preconditions.checkNotNull(
module.provideUrl(), "Cannot return null from a non-@Nullable @Provides method");
}
...
}
public final class MainModel_ProvideNameFactory implements Factory<String> {
...
@Override
public String get() {
return Preconditions.checkNotNull(
module.provideName(), "Cannot return null from a non-@Nullable @Provides method");
}
...
}
MainActivity_MembersInjector源码:
public final class MainActivity_MembersInjector implements MembersInjector<MainActivity> {
private final Provider<String> urlProvider;
private final Provider<String> nameProvider;
...
//初始化urlProvider、nameProvider
...
//注入调用
@Override
public void injectMembers(MainActivity instance) {
...
instance.url = urlProvider.get();
instance.name = nameProvider.get();
}
...
}
public final class Main2Activity_MembersInjector implements MembersInjector<Main2Activity> {
private final Provider<String> urlProvider;
...
//初始化urlProvider、nameProvider
...
//注入调用
@Override
public void injectMembers(Main2Activity instance) {
...
instance.url = urlProvider.get();
}
...
}