sington
简单一句话概括就是:添加了sington注解,只要是同一个MainComponent对象,那么其提供就全都是所有对象都是同一个,即单例。否则全不一样。如果不是同一个MainComponent,那还用说吗,肯定不一样啊。
MainComponent mainComponent = DaggerMainComponent.create();
mainComponent.inject(this);
sington添加位置:
@Singleton
@Component(modules = MainModule.class)
public interface MainComponent {
void inject(MainActivity activity);
void inject(Main2Activity activity);
void inject(MainActivity.InnerClass innerClass);
}
@Module
public class MainModule {
@Singleton
@Provides
public ClassA providerA(){
return new ClassA();
}
}
相关代码(没贴全,只贴了主要)
public class MainActivity extends AppCompatActivity {
@Inject
ClassA sa;
@Inject
ClassA ia;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MainComponent mainComponent = DaggerMainComponent.create();
mainComponent.inject(this);
Log.e("yjm",sa.toString());
Log.e("yjm",ia.toString());
new InnerClass(mainComponent);
startActivity(new Intent(this,Main2Activity.class));
}
class InnerClass{
@Inject
ClassA aa;
@Inject
ClassA ab;
private MainComponent mainComponent;
public InnerClass(MainComponent mainComponent) {
this.mainComponent = mainComponent;
mainComponent.inject(this);
Log.e("yjmInnerClass",aa.toString());
Log.e("yjmInnerClass",ab.toString());
}
}
}
重要:掌握这个单例要干嘛,看了好像确实是实现了,却不知道为了什么,这就很瓜皮了。
项目中其实有很多需要用到单例,比如app,retrofitmanager,还有缓存管理,或者sp管理,数据库管理器。这些肯定都是要管理起来。我们可以将这些对象都注入到全局唯一的myapp中去,然后提供返回component的方法。在每个界面片段需要的地方获取下,就可以保证这些对象都是单例。这样也就成为了真正的全局单实例。
至于scope和sington的关系:@Singleton注释就是@Scope的一个默认实现
@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}
但是@scope的使用不仅如此。功能强大。因为还不是太懂,所以日后补充