2009-11-18 157 views
3

我在Spring學習中面臨一個問題,需要一些幫助。Spring和範圍屬性

我正在學習有關原型範圍bean的,這基本上意味着每個這個bean將被某人或某些其他豆類需要的時候,Spring將創建一個新的bean,而不是使用同一個。

所以,我想這段代碼,讓我們說我有這個Product類:

public class Product { 

    private String categoryOfProduct; 

    private String name; 

    private String brand; 

    private double price; 

    public String getCategoryOfProduct() { 
     return categoryOfProduct; 
    } 

    public void setCategoryOfProduct(String categoryOfProduct) { 
     this.categoryOfProduct = categoryOfProduct; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getBrand() { 
     return brand; 
    } 

    public void setBrand(String brand) { 
     this.brand = brand; 
    } 

    public double getPrice() { 
     return price; 
    } 

    public void setPrice(double price) { 
     this.price = price; 
    } 
} 

這裏沒有什麼特別,某些字符串,一個int和getter和setter方法。 然後,我創造了這個方面的文件:

<?xml version="1.0" encoding="UTF-8"?> 
<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.0.xsd"> 

    <bean id="product" class="com.springDiscovery.org.product.Product" scope="prototype"> 
     <property name="brand" value="Sega"/> 
     <property name="categoryOfProduct" value="Video Games"/> 
     <property name="name" value="Sonic the Hedgehog"/> 
     <property name="price" value="70"/> 
    </bean> 
</beans> 

然後我試圖打,看看我的原型範圍的理解是正確的,這個類:

package com.springDiscovery.org.menu; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import com.springDiscovery.org.product.Product; 


public class menu { 

    public static void main(String[] args) 
    { 
     ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml"); 
     Product product1 = (Product) context.getBean("product"); 
     Product product2 = (Product) context.getBean("product"); 

     System.out.println(product1.getPrice()); 
     System.out.println("Let's change the price of this incredible game : "); 
     product1.setPrice(80); 
     System.out.println("Price for product1 object"); 
     System.out.println(product1.getPrice()); 
     System.out.println("Price Product 2 : "); 
     System.out.println(product2.getPrice());    
    } 
} 

令人驚訝的對我的回答是:

70.0 
Let's change the price of this incredible game : 
Price for product1 object 
80.0 
Price Product 2 : 
80.0 

如此看來,當我已經更新了產品1對象的值,它已被更新,以及對產品2.在我看來是一個奇怪的行爲不是嗎?

+0

如果將product2的實例化移至product1.setPrice(80)之後會發生什麼? – 2009-11-18 14:28:39

回答

6

您對原型範圍的理解是正確的。從文檔:

非單身,在創建一個新的bean實例的每一個爲特定bean的一個請求時(即,它被注入到另一個bean或時間豆部署結果的原型範圍它通過容器上的編程getBean()方法調用請求)。

也就是說,我無法重現您觀察到的行爲(我正在運行您提供的代碼)。這就是我與spring-2.5.6.SEC01.jar

 
70.0 
Let's change the price of this incredible game : 
Price for product1 object 
80.0 
Price Product 2 : 
70.0 

我沒有嘗試春天的所有版本,但你可能使用了越野車的版本(不太可能,雖然),或者是在某個地方的另一個問題(更可能)。

+0

謝謝,我也使用Spring 2.5.6。我認爲這是IntelliJ中的源文件夾的問題。我意識到包含這個上下文文件的文件夾在我的IntelliJ配置中不再被引用爲源文件夾,所以我所做的任何更改都沒有考慮到,所以這個原型範圍實際上不是寫在xml中的。 – Farid 2009-11-18 14:46:52

1

bean部署的原型模式導致每次對該特定bean的請求完成時創建新的bean實例。

所以你是正確的,每個電話應該給一個新的實例。

0

無法重現:

70.0 
Let's change the price of this incredible game : 
Price for product1 object 
80.0 
Price Product 2 : 
70.0 

是你使用它正在尋找在同一XML文件?

0

那麼我只有這個上下文文件。但我認爲這是IntelliJ的一個問題。很高興我正確理解了這個原型的概念,這使得我在這個上下文中做了修改 - 文件完全被忽略了。我看到,當我有一個bean的時候,Spring說當試圖實例化它時沒有這個名字的bean ......奇怪!

謝謝你們!