注入对象列表以播放应用程序上下文

Posted

技术标签:

【中文标题】注入对象列表以播放应用程序上下文【英文标题】:Inject a list of objects to play application context 【发布时间】:2018-01-01 21:40:43 【问题描述】:

在我的项目中,我有一堆动物对象,例如:

其中一些有依赖注入:

class Monkey @Inject() (wsClient: WSClient, configuration: Configuration) extends Animal 
    ...

有些不是:

class Giraffe extends Animal 
    ...

在我的AnimalsService 类中,我需要一个所有动物对象实例的列表,

目前我的服务正在获取人员列表作为依赖注入:

class AnimalsService @Inject() (animals: List[Animal]) 
    // here I can use animals as my desire

然后我有一个绑定类来绑定它:

class Bindings extends AbstractModule 
  override def configure(): Unit = 
    bind(classOf[AnimalsService]).toProvider(classOf[AnimalServiceProvider])
  


object Bindings 
  class AnimalServiceProvider @Inject () (giraffe: Giraffe, monkey: Monkey ...) extends Provider[AnimalsService] 
    override def get: AnimalsService = 
      new AnimalsService(List(giraffe,monkey...))
    
  

这很好用,但我更希望在应用加载时以某种方式将列表添加到我的应用程序上下文中,所以我不需要这样做......

这个当前的解决方案也意味着我需要在每次需要新动物时向AnimalServiceProvider 构造函数和这里添加新的动物AnimalsService(List(giraffe,monkey...)),这将不断发生......

处理这种情况的最佳方法是什么?

我想可能使用@Named guice 注释,但不确定它是否正确或如何以这种方式命名对象列表...

【问题讨论】:

【参考方案1】:

我会做一个具有列表和添加定义的方法的 Singleton bean

class AnimalsService @Inject() () 
    val animals: List[Animal]
    def addAnimal(animal: Animal) 
        ....
    
    // here I can use animals as my desire

然后在每个需要动物的模块中都需要一个带有Eager bindings的额外单例

class MonkeyConfigurator @Inject() (animalsService: AnimalsService) extends Animal 
    animalsService.add(this) //Or anything
    // here I can use animals as my desire

【讨论】:

只是一个快速的想法,有一些细节缺失,我回家后尝试补充。

以上是关于注入对象列表以播放应用程序上下文的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法访问已处置的对象。此错误的一个常见原因是处理从依赖注入中解析的上下文

获取当前上下文以设置对象列表模型

bean的作用域

如何列出要注入 grails 的可用对象?

无法在 window.webpackJsonp 对象内的匿名函数上注入代码

如何在 Spring MVC 中模拟安全上下文以进行测试