我试图在我的一个程序中使用 Spring 4 的bean范围作为 prototype 来检查是否每个请求都创建了不同的对象。为此,我使用以下代码段:
<bean id="television" class = "org.java.springcore.Television" scope="prototype">
<property name="model" value="Samsung_6970"/>
<property name="yearOfManufature" value="2016"/>
<property name="diameter" value="55"/>
</bean>
然后我在Main类中初始化了三角形对象,如下所示:
public class TelevisionUser {
/**
* @param args
*/
public static void main(String[] args) {
// BeanFactory factory = new XmlBeanFactory(new
// FileSystemResource("spring.xml"));
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
context.registerShutdownHook();
Television television1 = (Television) context.getBean("television");
television1.setMsg("Setting messege for Television");
System.out.println("The message for television 1 is: "+television1.getMsg());
Television television2 = (Television) context.getBean("television");
System.out.println("The message for television 2 is: "+television2.getMsg());
}
}
我的电视课程如下:
public class Television implements InitializingBean
{
private Integer yearOfManufature;
private String model;
private Integer diameter;
private String msg;
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public Integer getYearOfManufature() {
return yearOfManufature;
}
public void setYearOfManufature(Integer yearOfManufature) {
this.yearOfManufature = yearOfManufature;
}
public Integer getDiameter() {
return diameter;
}
public void setDiameter(Integer diameter) {
this.diameter = diameter;
}
/**
* @return the msg
*/
public String getMsg() {
return msg;
}
/**
* @param msg the msg to set
*/
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("Initialising the Bean Television");
}
}
我有两个问题:
当使用scope属性时,XML验证器会抛出错误,&#34;属性&#34;范围&#34;必须为元素类型&#34; bean&#34;声明。 &#34; 范围属性是否已不再用于Spring 4?
如果我使用属性singleton并将其值设置为false,那么我的程序表现得很奇怪。即产出即将到来:
初始化Bean电视 电视1的信息是:为电视设置信息 电视2的信息是:为电视设置信息
从输出中可以看出bean只被初始化一次,即使我设置了singleton =&#34; false&#34;。因此,也正在为对象电视1设置消息,并且也正在为电视2反映该消息。
我不明白我哪里出错了。
答案 0 :(得分:3)
scope
元素上的 bean
属性,请参阅http://www.springframework.org/schema/beans/spring-beans-4.3.xsd beans schema。
singleton
已经消失了,这就是为什么你的例子可能失败的原因。它已经从Spring 2.0开始消失了,虽然仍然在内部支持,可能会在以后完全删除。
关于验证器为什么在bean定义上失败的原因:
检查您是否有正确的架构位置:
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd"
我在你的例子中看到了一些双重空格,检查是否只有空格或制表符,而且Unicode中没有奇怪的字符。