依赖注入、Scala和Spring

依赖注入、Scala和Spring,spring,scala,dependency-injection,Spring,Scala,Dependency Injection,我非常喜欢DI和松耦合系统的概念。然而,我发现Spring中的工具充其量是缺少的。例如,很难进行“重构”,例如更改Spring中声明的bean的名称。我是春天的新手,所以我会错过一些东西。没有编译时间检查等 我的问题是为什么我们要使用XML来存储配置?在我看来,春天(国际奥委会部分)的整体理念是强制某种创造模式。在四人帮模式的世界中,设计模式是信息丰富的。另一方面,Spring(和其他DIs)提供了应用程序如何与单个组件连接的非常明确的方式 我把Scala放在了标题中,我也在学习它。你们认为如何

我非常喜欢DI和松耦合系统的概念。然而,我发现Spring中的工具充其量是缺少的。例如,很难进行“重构”,例如更改Spring中声明的bean的名称。我是春天的新手,所以我会错过一些东西。没有编译时间检查等

我的问题是为什么我们要使用XML来存储配置?在我看来,春天(国际奥委会部分)的整体理念是强制某种创造模式。在四人帮模式的世界中,设计模式是信息丰富的。另一方面,Spring(和其他DIs)提供了应用程序如何与单个组件连接的非常明确的方式


我把Scala放在了标题中,我也在学习它。你们认为如何创建一种域语言(类似于actor库)来进行依赖项摄取。在Scala中编写实际的注入代码,您将获得它附带的所有优点和工具。虽然应用程序开发人员也可以绕过您的框架,但我认为标准化相对容易,例如主网站/应用程序将只加载特定模式的组件

我无法对scala做出评论,但DI有助于实现松耦合。它使重构大型应用程序变得更加容易。如果你不喜欢某个组件,就把它换掉。需要针对特定环境的另一个实现,只需插入一个新组件即可

我很喜欢DI的概念,而且很松散 耦合系统,很多。然而,我 发现弹簧中的工具在以下位置缺失: 最好的。例如,这很难做到 “重构”,例如更改名称 春天宣布的一粒豆子。我是新来的 到春天,所以我会想念 某物没有编译时间 检查等

你需要一个更智能的IDE。JetBrains的IntelliJ允许在充分了解Spring配置和类的情况下进行重构、重命名等

我的问题是我们为什么要使用 XML来存储配置

为什么不呢?你必须把它放在某个地方。现在您可以选择:XML或注释

国际海事组织, 春季(国际奥委会部分)的整体理念是 强迫某种创造模式。 在四人帮模式的世界里, 设计模式具有信息性

ApplicationContext只不过是一个大对象工厂/构建器。这是一个GoF模式

弹簧(和其他DIs)在另一个上 手,提供很有规定的方式如何 应该连接应用程序 使用单个组件

GoF甚至更具规范性:您必须将其构建到对象中,或者将其外部化到配置中。春天把它具体化了

我也把Scala放在了标题中 我正在学习。你们好吗 考虑创建一种域语言 (类似于演员库)用于 依赖性摄取

你的意思一定是“注射”

写作 Scala本身中的实际注入代码, 你得到了所有的好东西和工具 随它而来

除了春天现在给我的东西之外,我不知道那会给我买什么

虽然 应用程序开发人员也可以 我认为,绕过你的框架 标准化相对容易,比如 因为主网站/应用程序将仅 加载特定模式的组件

对不起,我不相信你的想法。我宁愿用弹簧


但没有理由不尝试一下,看看是否能比Spring更成功。让我们知道您是如何做到的。

有一篇关于将Scala与Spring和Hibernate结合使用的好文章


关于您的问题:您实际上可以使用注释。它有一些优点。反过来,XML很好,因为您不需要重新编译包含注入配置的文件。

我同意!对我来说,大多数人使用Spring的方式是地狱的温和版本

当您查看标准Springified代码时,到处都有接口,您永远不知道使用什么类来实现接口。您必须研究一些奇妙的配置才能找到答案。易读=不容易。要使此代码可浏览,您需要一个非常高级的IDE,如Intelly J

我们怎么会陷入这样的困境?我责备自动化单元测试!如果要将mock连接到每个类,则不能有依赖项。如果不是为了单元测试,我们可能在没有松耦合的情况下也能做得很好,因为我们不希望客户在我们的jar中随意替换单个类

在Scala中,您可以使用模式,比如“蛋糕模式”,在没有框架的情况下实现DI。也可以使用结构类型来执行此操作。与原始代码相比,结果仍然很混乱


个人认为我应该考虑在模块而不是类上进行自动化测试,以避免这种混乱,并使用DI来解耦整个模块。根据定义,这种策略不是单元测试。我认为大多数逻辑都存在于类之间的实际连接中,因此IMHO将从模块测试中获得比单元测试更多的好处

关于Scala是否需要DI还有一个持续的争论。有几种“自己动手”的方法,但通常这种简单的设置就足够了:

//the class that needs injection
abstract class Foo {
  val injectMe:String
  def hello = println("Hello " + injectMe)
}

//The "binding module"
trait Binder {
  def createFooInstance:Foo
}

object BinderImpl extends Binder {
  trait FooInjector {
    val injectMe = "DI!"   
  }

  def createFooInstance:Foo = new Foo with FooInjector
}

//The client
val binder:Binder = getSomehowTheRightBinderImpl  //one way would be a ServiceLoader
val foo = binder.createFooInstance
foo.hello
//--> Hello DI!

对于其他版本,请看一个例子。

我不同意XML在Java和Spring中是一个问题: 我广泛使用Spring和Java,没有太多的XML,因为大多数配置都是通过注释完成的(类型和名称是强大的契约)——看起来非常好。我只在10%的情况下使用XML,因为使用XML比使用工厂/新类/注释编写特殊解决方案更容易。这种方法受Guice和Spring的启发,Spring从3.0实现为JSR-330(但即使我使用Spring 2.5,Spring工厂配置了JSR-330注释,而不是默认的特定于Spring的@Autowired)


可能scala可以为DI风格的开发提供更好的语法,我现在正在研究它(尖蛋糕模式)。

java中有不同的DI方法,一种