Spring的示例,其中值未在XML配置文件中进行硬编码

时间:2012-11-27 03:26:17

标签: java spring

我正在学习Spring,我想问一下在运行时是否有办法为Bean属性赋值? 我在互联网和书籍中尝试的所有示例通常都在xml文件中实现硬编码值
例如,本网站提供的简短教程http://www.dzone.com/tutorials/java/spring/spring-bean-setter-injection-1.html

User类具有getter和setter方法,但其所有值都在beans.xml中进行了硬编码。我尝试通过main()中的setter方法将值设置为User的成员变量但是我有很多错误。

 所以我只是想知道这是否可行,如果是的话我会非常感谢你能展示简短的样本或有本教程的网站。提前谢谢。

Exception in thread "main" org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unexpected failure during bean definition parsing
Offending resource: class path resource [SimpleValues.xml]
Bean 'insertValues'; nested exception is org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: <property> element for property 'name' must specify a ref or value
Offending resource: class path resource [SimpleValues.xml]
Bean 'insertValues'
    -> Property 'name'
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:324)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:579)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:477)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseBeanDefinitionElement(BeanDefinitionParserDelegate.java:446)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.processBeanDefinition(DefaultBeanDefinitionDocumentReader.java:311)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseDefaultElement(DefaultBeanDefinitionDocumentReader.java:202)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:181)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111)
    //More errors 

这是我的xml文件

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="insertValues" class="com.SimpleValues.SimpleValues">
        <property name="name"/> 

        <property name="age"/>

        <property name="height"/>

    </bean>

</beans>

主要方法

public static void main(String[] args) {

        GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
        ctx.load("SimpleValues.xml");
        ctx.refresh();

        SimpleValues inject = (SimpleValues) ctx.getBean("insertValues");
        inject.setName("Andres");
        inject.setAge(20);
        inject.setHeight(7);

        System.out.println("Name: "+ inject.getName()+ " Age: "+inject.getAge()+ " Height: "+inject.getHeight());
    }

3 个答案:

答案 0 :(得分:2)

如果您阅读了错误,您会看到它(正确地)抱怨您的XML无效(您正在使用格式错误的<property/>节点。假设您确实在其他位置获得了对insertValues并调用setter,然后只需从XML中删除3个<property/>节点。

也就是说,只需使用:

<bean id="insertValues" class="com.SimpleValues.SimpleValues" />

这将创建您的insertValues bean,而不是调用任何setter。

答案 1 :(得分:1)

您遇到的问题是,在使用属性时,您必须提供 ref (即对另一个Spring bean的引用)或。在您的示例中,由于您指的是原语(而不是其他bean),因此您可以使用以下内容:

<bean id="insertValues" class="com.SimpleValues.SimpleValues">
    <property name="name" value="Andres"/> 
    <property name="age" value="20"/>
    <property name="height" value="7"/>
</bean>

通过执行此操作,您可以跳过main方法中的setter方法,并在从应用程序上下文中获取后直接从SimpleValues bean获取相应的值。

请参阅examples,并阅读有关Spring参考文档中setter based dependency injection的更多信息。

答案 2 :(得分:-1)

在这里,在尝试动态初始化值时,尝试获取bean类的set属性中的值(使用Scanner方法),并在XML文件中传递默认值,这样访问就转到了setter方法,您可以初始化其中的值,并在获取getter方法中的值时使用这些值。