2012-08-14 62 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