由Spring框架管理的Java类或POJO被称为Bean或Spring Bean, Spring框架 或Spring MVC 中的Bean范围 是由Spring IOC容器管理的Bean范围。你可能知道Spring是一个基于**依赖注入和反转控制**的框架,它为Java应用程序提供Bean管理设施。在Spring管理的环境中,Bean(Java Classes)由Spring框架创建和连接。Spring允许你定义如何创建这些Bean,Bean的范围就是其中的一个细节。范围类似于Java中的访问修饰符,它规定了一个特定类的可见性。
在spring框架中,在 ApplicationContext.xml中声明的bean 可以驻留在五个作用域中。
-
Singleton (默认作用域)
-
原型
-
请求
-
会话
-
global-session
Singleton 和 prototype 是两个常见的Bean范围,在所有Spring应用上下文中都可用,而 请求、 会话 和 全局会话 Bean范围只在 WebApplicationContext 等Web感知应用上下文中可用 。
顺便说一下,如果你是Spring框架的新手,那么我也建议你参加一个全面的、最新的课程来深入学习Spring。如果你需要推荐,我强烈建议你看一下**《Spring Framework 5: Beginner to Guru** 》,这是学习现代Spring的全面和实践课程之一。它也是最新的,涵盖了Spring 5。
现在,让我们更详细地了解Singleton和prototype Bean的作用。
5个Spring框架中的Bean作用,举例说明
Singleton Bean作用域是 Spring中声明的 Bean的默认作用域 ,当你 在ApplicationContext.xml或 Spring配置文件 中指定Bean细节 时,它 适用 。Singleton Bean的作用就像Java中的Singleton模式,每个Spring容器只创建一个Bean的实例。
因此,无论你调用 getBean() 方法 多少次 ,如果它的Bean作用域被声明为Singleton,都会返回同一个Bean实例 。而在原型Bean 范围 的情况 下 ,每次 调用getBean() 都 会 创建一个新的Spring Bean实例。 Singleton和prototype bean scope之间的区别也是一个流行的Spring问题。
另一方面 , 请求Bean作用域 允许每个HTTP请求拥有自己的Spring框架创建和提供的Bean实例,而会话Bean作用域允许Web应用程序在每个会话的基础上拥有Bean实例。这两个Bean作用域都可以在WebApplicationContext 或任何Web感知的应用程序上下文中使用 。
最后一个是全局会话Bean作用,只适用于portlet 感知的Bean作用,允许每个全局会话有Bean实例。简而言之 单身与原型 是很重要的,它清楚地将一个实例与多个Bean实例隔离开来。
如果你有兴趣学习更多关于Spring的基础知识,你也可以查看Spring框架。Spring Fundamentalsight上的Bryan Hansen的课程 。这是一个很好的课程,可以在2个半小时内学会Spring的基本概念。
如何在Spring框架中指定Bean范围
为了指定Bean范围,你可以在Spring上使用Annotation,也可以在Application Context上定义它, 例如在下面的Spring配置文件中,AuditService 被配置为Singleton,使用singleton Bean范围,PaymentService 为prototype Bean范围。
//在singleton Bean范围上配置的bean
<bean id="auditService" class="com.sample.service.impl.AuditServiceImpl" scope="singleton"//
由于singleton也是spring框架中的默认范围,下面的声明完全相同,并在singleton范围上创建bean。
<bean id="auditService" class="com.sample.service.impl.AuditServiceImpl" />
虽然我更喜欢明确的声明,以使Bean的范围响亮而清晰。现在,每次你调用 getBean("auditService")时 ,都会返回 AuditService 的同一个实例 。
AuditService auditService = ApplicationContext.getBean("auditService")。
//在原型bean范围上配置的bean
<bean id="auditService" class="com.sample.service.impl.AuditServiceImpl" scope="prototype"//
在原型豆的情况下,每次调用 getBean("auditServie") 将返回 AuditServiceImpl 类 的不同实例 。如果你想使用注解来定义Bean的范围 ,你可以 在Bean类上 使用 @Scope("singleton") 或 @Scope("prototype") 。
你还需要启用组件扫描,以便让Spring知道Bean的范围。你可以在Spring 2.5中这样做: <context:component-scan base-package="com.sample.service.impl"/>. Bean范围在不同的spring版本中没有变化,到目前为止,两个最常用的spring版本spring 2.5和spring 3.0只有五个Bean范围。
Spring 2.5和Spring 3.0中的Bean Scope是相似的,所有默认的作用域在Spring 3.0中仍然被支持,但增加了一些新的作用域,如线程作用域或SimpleThreadScope ,这是一个由线程支持的作用域。你也可以使用CustomScopeConfigurer 工具注册你自己的自定义作用域,在spring 3.0中没有为bean引入新的作用域。
以上就是关于**Spring框架中的Bean作用域的内容。**由于Bean的创建是由Spring IOC容器管理的,因此值得记住的是如何为一个特定的Bean指定一个作用域,以及什么是Bean的默认作用域(Singleton),以避免任何假设和相应的代码。
您可能喜欢的其他Java教程
参考资料
www.springsource.org/spring-fram…
P.S. - 如果你想深入学习如何使用Spring MVC开发RESTful Web Service,我建议你参加**Learn Spring.Spring的认证课程。Eugen Paraschiv的认证班**。这是最好的课程之一,可以通过有指导的、以代码为中心的方式从头开始学习Spring 5和Spring Boot 2。