我有一个带有自动扫描和@Component注释的Spring项目。需要使用@Autowired将一些组件注入到不同的bean中。它是默认情况下创建为单例的相同组件bean吗?如果是这样,我如何将同一组件的不同实例注入不同的bean?
P.S。我知道它接近基础,听起来非常普遍。只想为自己说清楚。
提前致谢
答案 0 :(得分:3)
创建bean定义时,可以创建一个配方,用于创建该bean定义定义的类的实际实例。 bean定义是一个配方的想法很重要,因为这意味着,与一个类一样,您可以从一个配方创建许多对象实例。
您不仅可以控制要插入到从特定bean定义创建的对象中的各种依赖项和配置值,还可以控制从特定bean定义创建的对象的范围。这种方法功能强大且灵活,您可以选择通过配置创建的对象的范围,而不必在Java类级别烘焙对象的范围。可以将Bean定义为部署在多个范围之一中:开箱即用,Spring Framework支持七个范围,其中五个范围仅在您使用支持Web的ApplicationContext时才可用。
开箱即用支持以下范围。您还可以创建自定义范围。
<强>的Singleton 强> (默认)将每个Spring IoC容器的单个bean定义范围限定为单个对象实例。
<强>原型强> 将单个bean定义范围限定为任意数量的对象实例。
请求强> 将单个bean定义范围限定为单个HTTP请求的生命周期;也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的。仅在Web感知Spring ApplicationContext的上下文中有效。
<强>会话强> 将单个bean定义范围限定为HTTP会话的生命周期。仅在Web感知Spring ApplicationContext的上下文中有效。
<强> globalSession的强> 将单个bean定义范围限定为全局HTTP会话的生命周期。通常仅在Portlet上下文中使用时有效。仅在Web感知Spring ApplicationContext的上下文中有效。
<强>应用强> 将单个bean定义范围限定为ServletContext的生命周期。仅在Web感知Spring ApplicationContext的上下文中有效。
<强>的WebSocket 强> 将单个bean定义范围限定为WebSocket的生命周期。仅在Web感知Spring ApplicationContext的上下文中有效。
有关详细信息,请访问:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/
答案 1 :(得分:2)
默认情况下,如果您希望许多实例将其定义为singleton
,则Spring托管bean的范围为prototype
(仅创建一个实例)。
使用以下注释:
@Scope("prototype")
这是一个很好的完整示例: