我是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"
,但是当我尝试这样做时,我得到一个异常。有人可以建议如何克服这个问题吗?
答案 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.triangle
和com.thomson.learn.spring.shape
必须作为项目中的类存在。您的String
类bean无法工作,因为String
没有name
属性(getName()
方法getter)可以访问。
答案 2 :(得分:0)
如果要将String注入到所有bean中,可以引用属性文件中的属性并使用<context:property-placeholder location="location to .properties"/>
或者您可以使用<util:properties />
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"/>