支持使用Scala命名/默认参数的构造函数注入的IoC容器?

支持使用Scala命名/默认参数的构造函数注入的IoC容器?,scala,constructor,ioc-container,named-parameters,Scala,Constructor,Ioc Container,Named Parameters,如果可以利用Scala 2.8的命名参数和默认参数特性,我更喜欢使用构造函数注入而不是JavaBean属性注入。是否存在支持此功能的IoC容器,或者可以轻松扩展以支持此功能?(所需信息在类的scala.reflect.ScalaSignature注释的运行时中。) 我还对国际奥委会容器有一些基本的(?)期望: 自动布线(按目标类/特征或注释,一对一和一对多) 显式注入(显式连接)没有太多麻烦(比如Guice在那里很弱)。像user那样被注入newconnectionpool(user=“tes

如果可以利用Scala 2.8的命名参数和默认参数特性,我更喜欢使用构造函数注入而不是JavaBean属性注入。是否存在支持此功能的IoC容器,或者可以轻松扩展以支持此功能?(所需信息在类的
scala.reflect.ScalaSignature
注释的运行时中。)

我还对国际奥委会容器有一些基本的(?)期望:

  • 自动布线(按目标类/特征或注释,一对一和一对多)
  • 显式注入(显式连接)没有太多麻烦(比如Guice在那里很弱)。像
    user
    那样被注入
    newconnectionpool(user=“test”)
  • 关闭时清理的生命周期回调(按正确顺序)
Spring显然可以做到这些,但它不支持命名参数。我曾考虑过使用
FactoryBean
-s来连接Scala和Spring,但据我所知,这意味着太多的麻烦(样板文件或代码生成)。

A部分 我有一个正在进行的反射库,它解析Scala签名,目前能够解析命名参数:

不幸的是,我还没有将其绑定到Java反射中,以便能够调用方法,也没有添加解析默认值的逻辑(尽管这应该很简单)。这两项功能在我的待办事项列表中都非常重要:)

这本身不是一个IoC容器,但它是我的另一个项目的先决条件:。scalaj-spring的工作停止了,因为显而易见,除非我有了基于签名的反射,否则我将无法取得任何有价值的进一步进展

乙部 不管怎样,所有这些东西都是为大企业的人准备的。那些别无选择,只能将他们闪亮的新Scala代码集成到某个庞大的遗留系统中。。。如果这不是您的用例,那么您可以直接在Scala内部执行Scala DI

升降机横幅下提供DI支持:

您还应该四处寻找蛋糕图案的参考

我曾考虑过使用FactoryBean-s连接Scala和Spring,但这意味着太麻烦了


我不确定我是否理解其中的复杂性。实际上,在Scala中实现SpringFactoryBeans非常简单。看看这篇小文章

我刚刚发布了Sindi,一个用于Scala编程语言的IoC容器


Scala中的另一个依赖项注入框架在第二部分中是

您是否建议在没有可集成的遗留系统的情况下,cake模式通常替代IoC容器?我对此持悲观态度。Cake不提供生命周期事件(构造函数是按
val
顺序调用的,除非您使用
lazy var
-s,否则不能按正确的依赖顺序调用),它的自动布线能力有限(就像它不能在“一”端是集合的情况下进行一对多布线一样),等等。当然,它涵盖了许多在Java中使用Spring或类似工具的用例,但所有这些都是?生活方式事件可以说不是依赖注入的一部分,尽管我很欣赏它经常结合使用。更一般地说,生活方式事件无论如何在不可变的对象图中没有位置。。。您还将发现Scala在初始化Singleton(另一个通常委托给Spring的特性)时做了正确的事情。即使使用不可变对象,也需要“init”生命周期事件,它是由构造函数实现的(假设您避免了属性注入)。但是,cake不会自动排序这些初始化(除非您对所有内容都使用
lazy val
)。因此,即使您声明
foo
依赖于
bar
,当
foo
的构造函数运行时,
bar
仍然可以
null
。理想情况下,您可以将所有内容设置为一个有向无环图,然后每个对象都将在其他地方使用之前进行初始化。如果您真的别无选择,只能引入一个循环(有时是不可避免的),那么您可以通过将依赖项作为by-name参数传递,并在必要时(正如您已经指出的)p.s.将其分配给惰性val来“打破”它。经过两阶段初始化的对象不能被视为不可变的。如果在构造后必须更改某些内容,则不会。对于每个普通类,它都是一个额外的样板类,至少假设您有任何构造函数参数,这就是这个问题的内容。然后,对于每个构造函数参数,必须创建@BeanProperty,然后将其值传递给构造函数。这都是纯样板,有0个值,我的意思是,它可能是100%机器生成的。