我正在学习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());
}
答案 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方法中的值时使用这些值。