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();
}
}
相關(guān)代碼(沒貼全,只貼了主要)
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());
}
}
}
重要:掌握這個單例要干嘛,看了好像確實是實現(xiàn)了,卻不知道為了什么,這就很瓜皮了。
項目中其實有很多需要用到單例,比如app,retrofitmanager,還有緩存管理,或者sp管理,數(shù)據(jù)庫管理器。這些肯定都是要管理起來。我們可以將這些對象都注入到全局唯一的myapp中去,然后提供返回component的方法。在每個界面片段需要的地方獲取下,就可以保證這些對象都是單例。這樣也就成為了真正的全局單實例。
至于scope和sington的關(guān)系:@Singleton注釋就是@Scope的一個默認實現(xiàn)
@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}
但是@scope的使用不僅如此。功能強大。因為還不是太懂,所以日后補充