2012-08-14 65 views

回答

8

這取決於bean被註釋的scope。如果它的範圍是singleton,那麼它將在Spring ApplicationContext的每個地方使用相同的實例。如果它的範圍是prototype,那麼將在每個位置使用新的實例。

<bean id="id" class="some.NewObject" scope="prototype"/> 
<bean id="id2" class="some.AnotherNewObject" scope="singleton"/> 

這些bean定義加上下面的代碼將有助於說明。

class Class1 { 
    @Autowired 
    some.AnotherNewObject obj; 
} 

class Class2 { 
    @Autowired 
    some.AnotherNewObject obj; 
} 

class Class3 { 
    @Autowired 
    some.NewObject obj; 
} 

class Class4 { 
    @Autowired 
    some.NewObject obj; 
} 

Class1Class2將接收到的some.AnotherNewObject同一實例的引用。 Class3Class4將接收對some.NewObject的不同實例的引用。

如果您使用的註釋和包掃描配置,那麼你可以可以使用@Scope批註指定的範圍:

@Component 
@Scope("prototype") 
class NewObject { 
    ... 
} 

@Component 
@Scope("singleton") 
class AnotherNewObject { 
    ... 
} 
+1

好,但它如何改變註解的範圍? – AhHatem 2012-08-14 13:16:05

+0

你是什麼意思,你可以提供更多的上下文嗎?您不能使用'@ Autowired'註釋來更改bean的範圍。 – 2012-08-14 13:17:52

+0

但是你可以用bean上的註解本身來改變作用域 – NimChimpsky 2012-08-14 13:20:19

4
@Service 
@Scope("prototype") 
public class CustomerService 
{} 
+0

我不明白爲什麼原型/單例.//沒有被Spring聲明爲枚舉。 – Eugene 2012-08-14 17:38:32

+0

@Eugene出於這個原因:http://stackoverflow.com/a/11741450/106261 – NimChimpsky 2012-08-14 19:31:44

+0

我同意這個帖子,其中答案談論一個控制器內的頁面的價值,但在這裏我們可以使用一個枚舉的原型,這將是一個編譯時間常量,Scope註釋會將ENUM作爲輸入,而不是String。例如Hibernate的GeneratedValue可以做到這一點。 – Eugene 2012-08-14 19:40:49