java – Dagger 2 – 注入非Android类
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Dagger 2 – 注入非Android类,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4338字,纯文字阅读大概需要7分钟。
内容图文
![java – Dagger 2 – 注入非Android类](/upload/InfoBanner/zyjiaocheng/751/79dcfa0b4c07492b96393206b2c4e159.jpg)
我在我的Android应用程序中恭维Dagger 2.我按以下方式设置它:
AppComponent.java
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
AndroidSupportInjectionModule.class,
ActivityBuilder.class,
AppModule.class,
DataBaseDaoModule.class
})
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application aApplication);
AppComponent build();
}
Application application();
void inject(MyApplication aApplication);
}
AppInjector.java
ublic class AppInjector {
public static void init(MyApplication aApplication) {
//Initialize dagger and inject the aApplication
DaggerAppComponent.builder().application(aApplication).build().inject(aApplication);
aApplication.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity aActivity, Bundle aBundle) {
handleActivity(aActivity);
}
@Override
public void onActivityStarted(Activity aActivity) {
}
@Override
public void onActivityResumed(Activity aActivity) {
}
@Override
public void onActivityPaused(Activity aActivity) {
}
@Override
public void onActivityStopped(Activity aActivity) {
}
@Override
public void onActivitySaveInstanceState(Activity aActivity, Bundle aBundle) {
}
@Override
public void onActivityDestroyed(Activity aActivity) {
}
});
}
private static void handleActivity(Activity aActivity) {
if (aActivity instanceof HasActivityInjector) {
AndroidInjection.inject(aActivity);
Timber.d("injected Activity");
}
if (aActivity instanceof FragmentActivity) {
((FragmentActivity) aActivity).getSupportFragmentManager()
.registerFragmentLifecycleCallbacks(
new FragmentManager.FragmentLifecycleCallbacks() {
@Override
public void onFragmentCreated(FragmentManager fm, Fragment f,
Bundle savedInstanceState) {
if (f instanceof Injectable) {
Timber.d("injected Fragment");
AndroidSupportInjection.inject(f);
}
}
}, true);
}
}
}
AppModule.java
Module(includes = ViewModelModule.class)
class AppModule {
@Singleton
@Provides
ApiService providesApiService(OkHttpClient aClient, MyInterceptor aInterceptor) {
//Build a Retrofit object here
}
@Singleton
@Provides
OkHttpClient providesOkHTTPClient(MyInterceptor aInterceptor) {
//Setup OKHTTP here
}
}
最后在onCreate方法的MyApplication.Java中,我只是像这样调用AppInjector:AppInjector.init(this);
所有这些工作以及我在AppComponent的模块中放置的任何内容,我都可以注入Activities,Fragments和ViewModels.
但是,我有一些情况需要一个实用程序类,它依赖于Application,用于上下文 – 我在各个地方使用实用程序类.或者我将有一个Manager类,它取决于Application,或者需要来自AppModule的东西.但是,由于我在Activities,Fragments和ViewModels之外使用这些类,我不能只注入.我如何为我的实用程序类提供它们的依赖项和任何其他类型的类 – 比如管理器类?
我的第一个想法是创建一个UtilityComponent和一个ManagerCompoent,但我不知道如何让他们在AppModuel或我的AppComponent中使用它们.
解决方法:
请不要只使用component.inject(myObject).始终更喜欢构造函数注入,或者从可以执行其他设置步骤的模块提供构造函数注入. .inject(myObject)适用于您无权访问构造函数的Framework组件.
My first thought was to create a UtilityComponent and a ManagerCompoent of sorts, however I have no idea how I would get them to work with anything in AppModuel or through my AppComponent.
您不需要单独的组件.见下文.
However, since I use these classes outside of Activities, Fragments and ViewModels I cannot just inject.
这与注射无关.你在讨论范围,听起来你的工具是@Singleton.您的AppComponent是一个@Singleton作用域组件,因此它也可用于提供您的工具.
However, I have cases where I would need a utility class, that depends on
Application
, forcontext
如果它们是可以访问您的应用程序的@Singleton组件的一部分,那么它们也可以在其他任何地方提供.无需更多组件或任何东西.只需声明你的依赖关系,不要过度思考它.
只需声明你的util,用@Singleton注释它,并使用@Inject标记构造函数以进行构造函数注入. @Singleton确保它将由您的AppComponent提供,并可以访问它所依赖的应用程序.
@Singleton public class MyUtil {
private Application application;
@Inject public MyUtil(Application application) {
this.application = application;
}
}
然后你可以将它注入你的活动,片段甚至其他工具……
@Singleton public class MyUtilWrapper {
private MyUtil myUtil;
@Inject public MyUtilWrapper(MyUtil myUtil) {
this.myUtil = myUtil;
}
}
您可以将一个或两个注入您的活动或片段……
@Inject MyUtil myUtil;
@Inject MyUtilWrapper myUtilWrapper;
void onCreate(..) {
AndroidInjection.inject(this);
}
您不需要任何模块,提供方法或组件来提供简单的类.只需确保添加正确的范围!
内容总结
以上是互联网集市为您收集整理的java – Dagger 2 – 注入非Android类全部内容,希望文章能够帮你解决java – Dagger 2 – 注入非Android类所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。