Dagger之拓展sington与scope

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的使用不仅如此。功能强大。因为还不是太懂,所以日后补充

你可能感兴趣的:(Dagger之拓展sington与scope)