单利
一个对象在整个程序生命周期只存在1个,我们把它称为单利,什么懒汉,饿汗,静态内部类单利(推荐)都是实现的方式。
在Dagger只需要一个注解就OK了@Singleton
简单运用
@Module public class TestModule { @Provides @Singleton//主要是这样 public OkHttp providesOkHttp(){ return new OkHttp(); } }
@Singleton //注意这里Moudle中有singleton的,component也必须写 @Component(modules = {TestModule.class}) public interface TestCompent { void inject(Main2Activity main2Activity); }
okhttp是我随便创建了一个对象
public class Main2Activity extends AppCompatActivity { @Inject public OkHttp okHttp; @Inject public OkHttp okHttp2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); DaggerTestCompent.create().inject(this); log(okHttp+""); log(okHttp2+""); } public void log(String value){ Log.d("wyz", value); } }
这样你就算写了2个,发现2个都是一个对象,这就是简单的使用。
接下来考虑一个业务情景,顺便说下Component的dependencies依赖
例如,app有很多请求,我们只需要一个OkHttp对象,我们创建了很多Component,我们只需要让创建的依赖我们一开始创建的1个单利的Component,以后所有的都依赖这个
比如我们有一个登录业务的功能
我们先创建所有的单利
@Module public class AppModule { @Singleton @Provides public OkHttp providesOkHttp(){ return new OkHttp(); } }
@Singleton
@Component(modules = {AppModule.class})
public interface AppCompent {
OkHttp okhttp();//注意这里,没有注入方法,只有一个桥接方法,告诉我提供哪些对象
}
接下来就是去依赖
@UserSingleton @Component(dependencies = {AppCompent.class}) public interface UserCompent { void inject(MainActivity mainActivity); }
使用规则记录下:
1.componet 的inject 方法接收父类型参数,而调用时传入的是子类型对象则无法注入
2.component 关联的modules中不能有重复的provide
3.module 的provide 方法使用了scope,那么component 就必须使用同一个注解
4.module 的provide 方法没有使用scope,那么component 和module 是否加注解都无关紧
要,可以通过编译
5.component的dependencies与component 自身的scope 不能相同,即组件之间的scope 不同
6.Singleton的组件不能依赖其他scope的组件,只能其他scope的组件依赖Singleton的组件
7.没有scope的component不能依赖有scope的component
8.一个component不能同时有多个scope(Subcomponent除外),如果单利需要自己创建
9.@Singleton 的生命周期依附于component