Spring Core - 硬编码值

时间:2013-11-05 00:43:14

标签: java spring

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

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

<bean id="person" class="vail.Person">
    <constructor-arg ref="address" />
</bean>
好的,所以这里是我迷路的地方。在我的研究中(主要是通过教程)我从这一点上只看到了两个选项。但是,我将添加第三个:

  1. 我在xml中加入地址定义,基本上硬编码地址。问题=不是每个人都生活在123无处博士。
  2. 我将其硬编码到地址类中。问题=不是每个人都生活在123无处博士。
  3. (这是我的想法)我在Address类中为“street”参数添加了一个setter。我在Person类中添加了一个“setStreet”方法。在实例化Person之后,Spring注入了我的(空)依赖项。然后我打电话给街道名称传递“setStreet”。 “setStreet”然后调用地址类中“street”参数的setter。现在我终于得到了我的依赖,而不知道它。
  4. 这有什么办法吗?这似乎很难解决主要和地址的分离问题。对此事的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

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

一个例子是

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

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

这里有一个数据检索器bean,可能是其他bean用于检索数据。如果数据库服务发生更改,则会将其连接起来。您可以连接到不同的数据库(或模拟数据库服务)。

您的情况是您正在尝试连接特定人员 - 这通常不是您使用依赖注入的原因。

答案 1 :(得分: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个以上的课程(在企业应用程序中很常见)时,这样的事情将开始成为一场噩梦。

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