1

好的。我对 Spring 核心感到沮丧。首先让我举一个例子。您有三个类:Main、Person 和 Address。Main 是包含主要方法的类(可以说是驱动程序)。让我们假设每个人都有一个地址,或者更确切地说,需要一个地址才能发挥作用。它是一种依赖。我知道我们可以使用 Spring 通过构造函数或设置器将这些 bean “连接”在一起。假设我们是通过构造函数完成的。

<bean id="address" class="vail.Address" />

<bean id="person" class="vail.Person">
    <constructor-arg ref="address" />
</bean>

好的,这就是我迷路的地方。在我的研究中(主要是通过教程),我从这一点上只看到了两种选择。但是,我将添加第三个:

  1. 我添加到 xml 中的地址定义中,本质上是对地址进行硬编码。问题 = 不是每个人都住在 123 nowhere 博士。
  2. 我将它硬编码到地址类中。问题 = 不是每个人都住在 123 nowhere 博士。
  3. (这是我的想法)我在 Address 类中为“street”参数添加了一个设置器。我在 Person 类中添加了一个“setStreet”方法。在 Person 实例化之后,Spring 注入了我的(空)依赖项。然后我调用传入街道名称的“setStreet”。“setStreet”然后调用地址类中“street”参数的设置器。现在我终于有了我的依赖,而 Main 不知道它。

有什么方法是正确的。将 Main 和 Address 解耦似乎很麻烦。在这件事上的任何帮助将不胜感激。

4

2 回答 2

5

我想你可能会误解为什么你可能会使用 spring。您通常使用它来注入对象的预定义实例。如果您需要动态创建的人员,则不会在 bean 文件中创建这些人员。

一个例子是

<bean id="DatabaseService" class="some.specific.DatabaseService"/>

<bean id="DataRetriever">
    <constructor-arg><ref bean="DatabaseService"/></constructor-arg>
</bean>

这里有一个数据检索器 bean,大概是其他 bean 用于检索数据。数据库服务是连线的,以防它发生变化。您可以连接到不同的数据库(或模拟数据库服务)。

你的情况是你试图联系特定的人——这通常不是你使用依赖注入的原因。

于 2013-11-05T00:46:20.713 回答
1

你的要求看起来很模糊。一个名为Person的类通常用于表示持久的域对象(例如:存储在内存、数据库、xml 等中的人员实例)。通常设置一个人的实例属性不会被归类为“硬编码”。

依赖注入派上用场的地方是当您必须管理跨多个类实例的依赖/引用时。

例如,假设您的程序是具有控制器类PersonController的 Web 应用程序,并且为了从数据库中查找人员实例,您使用PersonDAO类,那么您的 spring 配置可能如下所示

<bean id="personDAO" class="myapp.PersonDAO"/>

<bean id="personController" class="myapp.PersonController">
  <property name="personDAO" ref="personDAO"/>
</bean>

请注意在 PersonController 类中,您如何从样板代码中解脱出来以查找/创建PersonDAO。您不必考虑应该首先创建哪个类以及应该引用哪个类。当您有 10 多个课程(在企业应用程序中很常见)时,这样的事情将开始成为一场噩梦。

当您还使用基于注释的自动装配时,这会变得更强大。

于 2013-11-05T01:48:49.243 回答