什么是Spring MVC框架中的Bean范围(附例

125 阅读5分钟

由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 可以驻留在五个作用域中。

  1. Singleton (默认作用域)

  2. 原型

  3. 请求

  4. 会话

  5. 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的基本概念。

What is Bean scope in Spring MVC framework with Example

如何在Spring框架中指定Bean范围

bean scope in Spring 2.5 and spring 3.0为了指定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。