1

我正在学习 Spring,我想问一下有没有办法在运行时为 Bean 属性赋值?我在互联网和书籍中尝试过的所有示例通常都在 xml 文件中实现硬编码值。

例如,在本网站http://www.dzone.com/tutorials/java/spring/spring-bean-setter-injection-1.html

中找到的简短教程 User 类具有 getter 和 setter 方法,但其所有值都是在 beans.xml 中硬编码。我尝试通过 main() 中的 setter 方法为用户的成员变量设置值,但出现了很多错误。

所以我只是想知道这是否可能,如果你能展示包含本教程的简短示例或网站,我将不胜感激。提前致谢。

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());
    }
4

3 回答 3

2

如果您阅读错误,您会看到它(正确地)抱怨您的 XML 无效(您使用的是格式错误的<property/>节点。假设您确实在其他地方有代码获取对设置器的引用insertValues并调用设置器,那么只需删除XML中的 3<property/>个节点。

也就是说,只需使用:

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

这将创建您的insertValuesbean 而不会调用任何设置器。

于 2012-11-27T03:48:15.463 回答
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>

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

请参阅示例并在 Spring 参考文档中阅读有关基于 setter 的依赖注入的更多信息。

于 2012-11-27T06:23:27.640 回答
-1

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

于 2015-07-12T15:44:50.807 回答