Spring框架中 Bean 的 prototype 作用域
【摘要】 在 Spring 框架中,prototype 是 Bean 的作用域(Scope)之一。它表示每次从 Spring 容器中获取该 Bean 时,都会创建一个新的实例。这与默认的 singleton 作用域不同,singleton 作用域下,Spring 容器中只会存在一个 Bean 实例。1. prototype 作用域的特点每次请求都会创建新实例:每次通过 ApplicationCont...
在 Spring 框架中,prototype
是 Bean 的作用域(Scope)之一。它表示每次从 Spring 容器中获取该 Bean 时,都会创建一个新的实例。这与默认的 singleton
作用域不同,singleton
作用域下,Spring 容器中只会存在一个 Bean 实例。
1. prototype
作用域的特点
-
每次请求都会创建新实例:每次通过
ApplicationContext.getBean()
或依赖注入获取 Bean 时,都会创建一个新的实例。 -
生命周期不由 Spring 管理:
prototype
Bean 的初始化回调(如@PostConstruct
)会执行,但销毁回调(如@PreDestroy
)不会执行,因为 Spring 不会管理prototype
Bean 的生命周期。 -
适合有状态的 Bean:如果 Bean 需要维护状态,或者每次使用时需要独立的实例,可以使用
prototype
作用域。
2. 配置 prototype
作用域
可以通过以下方式配置 prototype
作用域:
2.1 使用注解
在类上使用 @Scope
注解:
2.2 使用 XML 配置
在 XML 配置文件中定义 Bean 时指定 scope
属性:
运行 HTML
3. 使用 prototype
Bean
在 Spring 中,prototype
Bean 的使用方式与 singleton
Bean 相同,但每次获取时都会创建一个新实例。
3.1 通过依赖注入
3.2 通过 ApplicationContext
获取
4. prototype
与 singleton
的区别
特性 | prototype |
singleton |
---|---|---|
实例数量 | 每次请求创建一个新实例 | 整个容器中只有一个实例 |
生命周期管理 | Spring 不管理销毁阶段 | Spring 管理完整的生命周期 |
适用场景 | 有状态的 Bean,需要独立实例的场景 | 无状态的 Bean,共享实例的场景 |
性能 | 每次请求都会创建新实例,性能较低 | 单例模式,性能较高 |
5. 注意事项
-
prototype
Bean 注入到singleton
Bean 中:-
如果
prototype
Bean 被注入到singleton
Bean 中,prototype
Bean 的行为仍然是单例的,因为singleton
Bean 只会初始化一次。 -
解决方法:使用
@Lookup
注解或Provider
接口。
-
5.1 使用 @Lookup
注解
5.2 使用 Provider
接口
6. 总结
-
prototype
作用域适用于需要每次创建新实例的场景。 -
通过
@Scope("prototype")
或 XML 配置可以定义prototype
Bean。 -
注意
prototype
Bean 注入到singleton
Bean 中的问题,可以使用@Lookup
或Provider
解决。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)