如何使用当前的spring bean访问另一个spring bean中的数据

时间:2012-04-25 12:25:59

标签: java spring dependency-injection

我是Spring的新手,我的要求很小。

<bean name="triangle" class="com.thomson.learn.spring.triangle">
    <property name="name" ref="dataSource" />
</bean>

<bean id="dataSource" class="java.lang.String">
    <property name="name" value="easy" />
</bean>

我已经写了如上所示的bean。我需要使用easy从bean访问值id="triangle",但是当我尝试这样做时,我得到一个异常。有人可以建议如何克服这个问题吗?

3 个答案:

答案 0 :(得分:0)

String没有属性'name',因此您无法以您尝试的方式实例化。此外,您不需要,因为您可以直接使用它作为值,例如:

<bean name="triangle" class="com.thomson.learn.spring.triangle">
  <property name="name" value="easy" />
</bean>

编辑回复您的评论: 如果“name”的类型为shape,那么您需要在此处注入shape ...

<bean name="triangle" class="com.thomson.learn.spring.triangle">
  <property name="name" ref="shape" />
</bean>
<bean name="shape" class="com.thomson.learn.spring.shape">
    <!-- configure properties here -->
</bean>

Spring连接的对象应该是JavaBeans。这在实践中意味着他们有一个无参数的构造函数和一组属性,每个属性都有一个getter和一个setter。当您编写如上所述的定义时,Spring使用setter来设置您在配置文件中定义的属性。

例如,如果Shape是一个类,那么:

package com.thomson.learn.spring.Shape;

class Shape {

  private String name;

  public Shape() {
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

然后你可以用以下内容连接它:

<bean id="myShape" class="com.thomson.learn.spring.Shape">
  <property name="name" value="blah" />
</bean>

这真正转化为Spring在运行时执行以下操作:

Shape myShape = new Shape();
shape.setName("blah");

这就是它的全部,除了属性也可以是其他类的更复杂的实例,这就是为什么你可以使用ref来引用另一个bean来获取属性。

P.S。:在许多情况下,Spring可以使用反射来注入值,因此它实际上并不需要setter,但是大多数人出于各种原因以这种方式实现它们的bean。

答案 1 :(得分:0)

尝试以下方法:

<bean name="triangle" class="com.thomson.learn.spring.triangle">
        <property name="name" ref="dataSource" />
</bean>

<bean id="dataSource" class="com.thomson.learn.spring.shape">
    <property name="name" value="easy" />
</bean>

其中com.thomson.learn.spring.trianglecom.thomson.learn.spring.shape必须作为项目中的类存在。您的String类bean无法工作,因为String没有name属性(getName()方法getter)可以访问。

答案 2 :(得分:0)

如果要将String注入到所有bean中,可以引用属性文件中的属性并使用<context:property-placeholder location="location to .properties"/> 或者您可以使用<util:properties />

在配置xml中定义属性

property-placeholder

的示例
<bean id="appDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/> // Refered from property file
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

    <context:property-placeholder location="classpath:jdbc.properties"/>