@Component注解中的dependencies使用
如果一个Component需要另一个Component提供注入的类,那么就可以使用dependencies来实现,打个比喻,如果有三个容器A,B,C,AB有化学液体,C中没有,现在C需要A和B中的化学液体,那么就需要A的注射器将A注射到C中,B的注射器将B注射到C中,这里就是比如一下,也许会有点不恰当。话不多说直接上代码来体会(我是接着上一篇文章写的 如果没看上一篇文章,请移步dagger2的使用)
现在我们接着新建一个类AppInfo,这里是模拟一个第三方类,第三方类的构造函数没有加@Inject注解
public class AppInfo {
private String retrofit;
public AppInfo(String retrofit) {
this.retrofit = retrofit;
}
public String getRetrofit() {
return retrofit;
}
public void setRetrofit(String retrofit) {
this.retrofit = retrofit;
}
}
新建一个AppModule来提供一个全局使用的Module
@Module
public class AppModule {
//由于构造函数没有@Inject,所以我们直接提供这个类
@Provides
public AppInfo provideRetrofit(){
return new AppInfo("retrofit");
}
}
新建一个接口AppComponent
@Component(modules = AppModule.class)
public interface AppComponent {
//注入一个AppInfo
AppInfo getAppInfo();
}
我们rebuild一下,自动生成AppModule的实现类,然后我们修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
@Inject
User user;
@Inject
AppInfo appInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这里发生了改动,加入了DaggerAppComponent.builder().build(),可以这样理解
DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
Log.i("msg","appInfo的输出"+appInfo.getRetrofit());
Log.i("msg","user的输出"+user.getUserName());
}
}
下面是打印的结果:
I/msg: appInfo的输出retrofit
user的输出provideName
我们发现注入成功了
@Named注解使用,如果一个类里面同时需要注入两个相同类型的类,那该怎么办啊,这里就可以用@Name进行标记
修改MainActivityModule,提供两个User
@Module
public class MainActivityModule {
@Provides
@Named("userOne")
public User provideUserName(){
return new User("provideNameOne");
}
@Provides
@Named("userTwo")
public User provideUserName2(){
return new User("provideNameTwo");
}
}
修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
//这里接受@Named为userOne的注入
@Inject
@Named("userOne")
User user;
//这里接受@Named为userTwo的注入
@Inject
@Named("userTwo")
User user2;
@Inject
AppInfo appInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// DaggerMainActivityUser.builder().mainActivityModule(new MainActivityModule()).build().inject(this);
DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
Log.i("msg","userOne的输出"+user.getUserName());
Log.i("msg","userTwo的输出"+user2.getUserName());
}
}
查看一下打印的日志
I/msg: userOne的输出provideNameOne
userTwo的输出provideNameTwo
@Singleton注解,标注为该类的生成是单例模式,直接上代码
修改MainActivityModule的代码
@Module
public class MainActivityModule {
//单例模式的标注
@Singleton
@Provides
public User provideUserName(){
return new User("provideNameOne");
}
}
修改Component接口MainActivityUser
//单例标注,没错,这个地方也要
@Singleton
@Component(dependencies = AppComponent.class,modules = MainActivityModule.class)
public interface MainActivityUser {
void inject(MainActivity mainActivity);
}
修改MainActivity中的代码
public class MainActivity extends AppCompatActivity {
@Inject
User user;
@Inject
User user2;
@Inject
AppInfo appInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
Log.i("msg","userOne的输出"+user.hashCode());
Log.i("msg","userTwo的输出"+user2.hashCode());
}
}
查看一下打印的日志
I/msg: userOne的输出290606403
userTwo的输出290606403
生成了两个相同引用的User
Lazy懒加载的使用
我们修改MainActivity中的代码public class MainActivity extends AppCompatActivity {
@Inject
Lazy<User> user2;
@Inject
AppInfo appInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityUser.builder().appComponent(DaggerAppComponent.builder().build()).build().inject(this);
Log.i("msg","userTwo的输出"+user2.get().getUserName());
}
}
懒加载就是使用的时候才进行加载,使用到user2的时候才会实例化user2,然后通过.get()获得user2,有点像弱引用的用法