Spring 4不支持范围属性吗?

时间:2016-12-19 05:24:36

标签: java spring scope prototype javabeans

我试图在我的一个程序中使用 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");

    }
}

我有两个问题:

  1. 当使用scope属性时,XML验证器会抛出错误,&#34;属性&#34;范围&#34;必须为元素类型&#34; bean&#34;声明。 &#34; 范围属性是否已不再用于Spring 4?

  2. 如果我使用属性singleton并将其值设置为false,那么我的程序表现得很奇怪。即产出即将到来:

    初始化Bean电视 电视1的信息是:为电视设置信息 电视2的信息是:为电视设置信息

  3. 从输出中可以看出bean只被初始化一次,即使我设置了singleton =&#34; false&#34;。因此,也正在为对象电视1设置消息,并且也正在为电视2反映该消息。

    我不明白我哪里出错了。

1 个答案:

答案 0 :(得分:3)

Spring 4仍然支持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中没有奇怪的字符。