Spring 是春天';是否重用了s@Autowired对象?
如果是,如何阻止这种情况?这取决于被注释的Spring 是春天';是否重用了s@Autowired对象?,spring,dependency-injection,Spring,Dependency Injection,如果是,如何阻止这种情况?这取决于被注释的bean的范围。如果它属于范围singleton,那么它将在SpringApplicationContext中的任何地方使用相同的实例。如果它属于范围prototype,则将在每个位置使用一个新实例 <bean id="id" class="some.NewObject" scope="prototype"/> <bean id="id2" class="some.AnotherNewObject" scope="singleton"/
bean的范围。如果它属于范围singleton
,那么它将在SpringApplicationContext
中的任何地方使用相同的实例。如果它属于范围prototype
,则将在每个位置使用一个新实例
<bean id="id" class="some.NewObject" scope="prototype"/>
<bean id="id2" class="some.AnotherNewObject" scope="singleton"/>
Class1
和Class2
将收到对some.AnotherNewObject
的相同实例的引用Class3
和Class4
将收到对some.NewObject
的不同实例的引用
如果使用注释和包扫描进行配置,则可以使用@Scope
注释指定范围:
@Component
@Scope("prototype")
class NewObject {
...
}
@Component
@Scope("singleton")
class AnotherNewObject {
...
}
很好,但是它如何改变注释中的范围呢?你是什么意思,你能给出更多的上下文吗?您不能使用@Autowired
注释来更改bean的范围。但是您可以使用bean上的注释来更改范围。谢谢,这就是我要找的。我不明白为什么prototype/singleton//没有被Spring声明为枚举。我同意这篇文章,答案涉及控制器内页面的值,但这里我们可以使用原型的枚举,它将是编译时常量,范围注释将把枚举作为输入,而不是字符串。例如,Hibernate中的GeneratedValue就是这样做的。您不能使用枚举,因为Spring类的作用域是可扩展的。我可以定义自己的范围
并将其注册到Spring的ApplicationContext
,此时,它可以在Spring的@Scope
注释中使用。
@Component
@Scope("prototype")
class NewObject {
...
}
@Component
@Scope("singleton")
class AnotherNewObject {
...
}
@Service
@Scope("prototype")
public class CustomerService
{}