Articles of dependency injection

Android上的Guice性能

作为一名Java开发人员,我已经习惯于在应用程序中使用dependency injection。 对于Android,我对性能特别警惕。 在Android应用中使用Guice有什么性能影响? 我假设有一些开销,但它是否足够重要,我应该避免使用Guice? 我对它的使用可能只是将一些共享对象注入到各种活动中。

Dagger 1.x中的单身人士

当使用Dagger时,我发现当我在任何需要它的地方注入时,我会得到一个单例的多个实例。 我用@Singleton注释了类和提供方法。 谁能想到为什么会这样? 编辑: 如果它有帮助,我在Dagger的GitHub( https://github.com/square/dagger/tree/master/examples/android-activity-graphs )中使用与我的应用程序相同的结构作为示例应用程序。 我正在尝试在基本活动中使用@Provides并在自定义Application类中使用@Provides提供了几个第三方类。 是因为我在每个活动中加上原始对象图的模块吗? (PS:我一般都是Dagger和DI的新手,所以如果你能提供解释以便我可以学习,我将不胜感激。谢谢。)

使用KClasstypes绑定到映射

我试图通过他们的KClasstypes将ViewModel子类绑定到一个映射中: @Module abstract class ViewModelModule { @Binds @IntoMap @ViewModelKey(MyViewModel::class) abstract fun bindsMyViewModel(viewModel: MyViewModel): ViewModel @Binds abstract fun bindViewModelFactory(factory: ViewModelFactory): ViewModelProvider.Factory } 但我得到Dagger编译错误: e: ~/Example/app/build/tmp/kapt3/stubs/debug/com/example/app/injection/AppComponent.java:5: error: [dagger.android.AndroidInjector.inject(T)] java.util.Map<kotlin.reflect.KClass,? extends javax.inject.Provider> cannot be provided without an @Provides-annotated method. e: e: public abstract interface AppComponent { e: ^ e: java.util.Map<kotlin.reflect.KClass,? extends javax.inject.Provider> is injected at e: com.example.app.ui.ViewModelFactory.(creators) e: […]

ButterKnife onclick无效

我使用butterknife库完美地注入了视图。 但是当我尝试实现监听器时,例如onclick我无法实现它们。 以下java代码将帮助您了解我的问题。 Java代码: public class LoginActivity extends ActionBarActivity{ @InjectView(R.id.toolbar) Toolbar toolbar; @InjectView(R.id.btn_login) Button login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); ButterKnife.inject(this); initialize(); //initListeners(); @OnClick(R.id.btn_login) public void submit(View view) { // TODO submit data to server… } } /*private void initListeners() { @OnClick(R.id.btn_login) public void login(){ } }*/ private void initialize() { setSupportActionBar(toolbar); […]

Javadependency injection:Dagger 1 vs Dagger 2,哪个更好?

Dagger 2比Dagger 1有什么优势? 到目前为止,我发现(只)2: Dagger 2允许您使用代码混淆与proguard Dagger 2速度更快(在将它用于Android应用程序时没有多大优势,但如果你将它用于某种服务器,这肯定是一件很重要的事情) 与此同时,我发现了一个很大的缺点:你不能在Dagger 2中使用模块覆盖( @Module(overrides = true) ),这至少对我来说很烦人 – 它对于unit testing非常有用。 还有其他优点/缺点吗?

Dagger2不生成“Dagger_”文件

我一段时间使用匕首2,但今天尝试编译得到了这个错误: 错误:(13,31)错误:找不到符号类Dagger_GlobalComponent 错误:(38,21)错误:找不到符号variablesDagger_GlobalComponent 所以这是代码: public class MyAppApplication extends Application { private static GlobalComponent component; @Override public void onCreate() { super.onCreate(); component = Dagger_GlobalComponent.builder() .busModule(new BusModule()) .syncModule(new SyncModule()) .serviceModule(new ServiceModule()) .contextModule(new ContextModule(this)) .persistenceModule(new PersistenceModule(this)) .build(); }} 和gradle依赖: … compile ‘com.google.dagger:dagger:2.0-SNAPSHOT’ apt ‘com.google.dagger:dagger-compiler:2.0-SNAPSHOT’ provided ‘org.glassfish:javax.annotation:10.0-b28’ … 有解决方案? 已经尝试过:清理,重建,更改依赖版本,还删除Gradle缓存并重新安装Android Studio。 如果它有助于此示例项目也出现相同的错误: https://github.com/gk5885/dagger-android-sample https://github.com/mgrzechocinski/dagger2-example

Dagger 2 – 为什么这是一个依赖循环?

我正在尝试将应用程序的Context注入其他两个对象,即AuthManager和ApiClient 。 它们都取决于所述上下文, ApiClient依赖于AuthManager 。 为什么这是一个依赖循环,如果Context没有引用其他2? 这可以解决吗? 编辑:这是一些代码 @Module public class AppModule { private final Application application; public AppModule(Application application) { this.application = application; } @Provides @Singleton Context provideApplicationContext() { return this.application; } } @Module public class NetworkModule { @Provides @Singleton public AuthManager providesAuthManager(AuthManager manager) { return manager; } @Provides @Singleton public ApiClient providesApiClient(ApiClientFactory factory) […]

具有相同返回types的@Named提供程序最终会给出java.lang.IllegalArgumentException:Duplicate

这是问题, 我正在开发一个LibGDX项目,我有不同平台的不同模块。 这是我的android模块的样子: @Module( includes = {BaseModule.class, NetModule.class}, injects = {DummyProjectActivity.class, DummyProject.class}, overrides = true) public class DummyProjectAndroidModule { … @Provides @Singleton @Named(“DummyOne”) DummyInterface provideDummyOne() { return new DummyOne(); } @Provides @Singleton @Named(“DummyTwo”) DummyInterface provideDummyTwo() { return new DummyTwo(); } @Provides @Singleton @Named(“DummyConsumer”) DummyConsumer provideDummyConsumer(@Named(“DummyOne”) DummyInterface dummyOne, @Named(“DummyTwo”) DummyInterface dummyTwo) { return new DummyConsumer(dummyOne, dummyTwo); […]

Dagger 2注入构造函数

我开始在我正在开发的应用程序中使用Dagger 2,但我对Dagger 2的工作方式有一些疑问。 我得到了@Provides方法和@Inject注释背后的所有逻辑来初始化你的依赖关系,但@Inject注释到类构造函数有点像我的想法。 例如: 我的应用程序,我有一个模块定义,ContextModule,以检索我的应用程序的上下文: ContextModule.java @Module public class ContextModule { private final Context context; public ContextModule(Context context) { this.context = context; } @Provides public Context context() { return this.context; } } 我的BaseActivityComponent使用此模块: BaseActivityComponent.java @BaseActivityScope @Component(modules = ContextModule.class) public interface BaseActivityComponent { void injectBaseActivity(BaseActivity baseActivity); } 到目前为止很好..然后我有一个AuthController类,这取决于上下文,我想在我的BaseActivity中注入它。 所以在我的AuthControllers.class中我有类似的东西: public class AuthController { private Context […]

Butterknife View注射

我偶然发现了一个名为ButterKnife的非常有趣的dependency injection库。 使用ButterKnife可以很容易地将Views注入活动或片段。 class ExampleActivity extends Activity { @InjectView(R.id.title) TextView title; @InjectView(R.id.subtitle) TextView subtitle; @InjectView(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject(this); // TODO Use “injected” views… } } 但是,如果使用dependency injection,那些视图必须是public以便Butterknife可以注入它(使用private字段会导致exceptionfields must not be private or static )。 在我过去的项目中,我总是将所有成员字段(包括视图)设为private因为我认为这是最佳实践(信息隐藏等)现在我想知道是否有理由不应该public所有视图? 在这种情况下,我不能使用ButterKnife但我想使用它,因为它大大简化了代码。