当前位置:   article > 正文

Dagger2——(2)实现全局单例_dagger @singleton 局部 全局

dagger @singleton 局部 全局

@Single可以实现单例模式,但是是局部单例。因为@Single的范围取决于@Compenent,也就是注射器。而通常情况下只能创建多个@Component。所以需要采用别的方式。

首先:

@Singleton
@Component(modules = ShangjiaModule.class)
public interface Platform{
    ZhaiNan waimai();
    void waimai2(MainActivity mainActivity);
    void waimai2(Main3Activity main3Activity);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
@Module
public class ShangjiaModule {
    @Provides
    @BaoZi1
    public Baozi provideBaozi() {
        return new Baozi("豆沙包");
    }
    @Provides
    @Singleton
    public Noodle provideNoodle() {
        return new Noodle();
    }
    @Provides
    @Singleton
    public Apple provideApple() {
        return new Apple();
    }
    @Provides
    @Named("doushabao2")
    public Baozi provideBaozi2() {
        return new Baozi("豆沙包2");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

步骤1:

public class App extends Application {
    Platform platform;
    @Override
    public void onCreate() {
        super.onCreate();
        platform = DaggerPlatform.builder().build();
    }
    public static App get(Context context){
        return (App)context.getApplicationContext();
    }
    public Platform getPlatform(){
        return platform;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

步骤2:
修改AndroidManifest.xml

<application
        android:name=".App"
        .../>
</application>
  • 1
  • 2
  • 3
  • 4

步骤1和2的作用参见:
Android Context完全解析,你所不知道的Context的各种细节

主要是为了应用启动时,初始化自定义的Application也就是App。这样就可以调用其中的onCreate()方法,然后生成Platform platform供其他类使用。而且latform只有一个。

最后:
MainActivity.java

public class MainActivity extends AppCompatActivity {

    @BindView(R.id.b1)
    Button b1;
    
    @Inject
    Apple apple1;

    @Inject
    Apple apple2;

    Platform platform = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        ButterKnife.bind(MainActivity.this);
        platform = App.get(this).getPlatform();  //重点在这(得到单例的Platform,也就是单例的Component)
        platform.waimai2(this);
        b1.setText(apple1.hashCode() + "," + apple2.hashCode());
    }

    @OnClick(R.id.b1)
    public void onclick() {
        Toast.makeText(MainActivity.this, student.name, Toast.LENGTH_LONG).show();
        Intent intent = new Intent(MainActivity.this, Main3Activity.class);
        startActivity(intent);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

Main2Activity.java

public class Main2Activity extends AppCompatActivity {

    @BindView(R.id.b1)
    Button b1;
    @Inject
    Apple apple1;

    @Inject
    Apple apple2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        ButterKnife.bind(this);

        Platform platform = App.get(this).getPlatform();  //重点在这(得到单例的Platform,也就是单例的Component)
        ZhaiNan zhaiNan = platform.waimai();
        platform.waimai2(this);
        b1.setText(apple1.hashCode() + "," + apple2.hashCode());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

我们要做一个应用肯定要用到很多的Component,一般的划分规则就是有一个全局的Component,比如AppComponent。每个界面有一个Component,比如一个Activity定义一个Component,一个Fragment定义一个Component。

为了管理这些Component,就可以使用自定义Scope注解,它可以更好地管理Component和Module之间的匹配关系

而且自定义注解也很方便使用:毕竟下面就是@Single的源码

@Scope
@Documented
@Retention(RUNTIME)
public @interface Singleton {}
  • 1
  • 2
  • 3
  • 4

依葫芦画瓢:

@Scope
@Documented
@Retention(RUNTIME)
public @interface XXXScope {}
  • 1
  • 2
  • 3
  • 4

也是可以的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/529703
推荐阅读
相关标签
  

闽ICP备14008679号