Java Bean作用域是什么及怎么实现

PS:Java 中的公共类可称之为 Bean 或 Java Bean。

1.作用域

Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式。比如 singleton 单例作用域,就表示 Bean 在整个 Spring 中只有一份,它是全局共享的,当有人修改了这个值之后,那么另一个人读取到的就是被修改后的值。

举个例子,比如我们在 Spring 中定义了一个单例的 Bean 对象 user(默认作用域为单例),具体实现代码如下:

@Componentpublic class UserBean {    @Bean    public User user() {        User user = new User();        user.setId(1);        user.setName("Java"); // 此行为重点:用户名称为 Java        return user;    }}

然后,在 A 类中使用并修改了 user 对象,具体实现代码如下:

@Controllerpublic class AController {    @Autowired    private User user;    public User getUser() {        User user = user;        user.setName("MySQL"); // 此行为重点:将 user 名称修改了        return user;    }}

最后,在 B 类中也使用了 user 对象,具体实现代码如下:

@Controllerpublic class BController {    @Autowired    private User user;    public User getUser() {        User user = user;        return user;    }}

此时我们访问 B 对象中的 getUser 方法,就会发现此时的用户名为 A 类中修改的“MySQL”,而非原来的“Java”,这就说明 Bean 对象 user 默认就是单例的作用域。如果有任何地方修改了这个单例对象,那么其他类再调用就会得到一个修改后的值。

2.作用域分类

在 Spring 中,Bean 的常见作用域有以下 5 种:

  • singleton:单例作用域;

  • prototype:原型作用域(多例作用域);

  • request:请求作用域;

  • session:会话作用域;

  • application:全局作用域。

注意:后 3 种作用域,只适用于 Spring MVC 框架。

2.1 singleton

官方说明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.

描述:该作用域下的 Bean 在 IoC 容器中只存在一个实例:获取 Bean(即通过 applicationContext.getBean等方法获取)及装配 Bean(即通过 @Autowired 注入)都是同一个对象。

场景:通常无状态的 Bean 使用该作用域。无状态表示 Bean 对象的属性状态不需要更新。

备注:Spring 默认选择该作用域。

2.2 prototype

官方说明:Scopes a single bean definition to any number of object instances.

描述:每次对该作用域下的 Bean 的请求都会创建新的实例:获取 Bean(即通过 applicationContext.getBean 等方法获取)及装配 Bean(即通过 @Autowired 注入)都是新的对象实例。

场景:通常有状态的 Bean 使用该作用域。

2.3 request

官方说明:Scopes a single bean definition to the lifecycle of a single HTTP request. That is, each HTTP request has its own instance of a bean created off the back of a single bean definition. Only valid in the context of a web-aware Spring ApplicationContext.

描述:每次 Http 请求会创建新的 Bean 实例,类似于 prototype。

场景:一次 Http 的请求和响应的共享 Bean。

备注:限定 Spring MVC 框架中使用。

2.4 session

官方说明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.

描述:在一个 Http Session 中,定义一个 Bean 实例。

场景:用户会话的共享 Bean, 比如:记录一个用户的登陆信息。

备注:限定 Spring MVC 框架中使用。

2.5 application

官方说明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.

描述:在一个 Http Servlet Context 中,定义一个 Bean 实例。

场景:Web 应用的上下文信息,比如:记录一个应用的共享信息。

备注:限定 Spring MVC 框架中使用。

3.作用域设置

我们可以通过 @Scope 注解来设置 Bean 的作用域,它的设置方式有以下两种:

直接设置作用域的具体值,如:@Scope(“prototype”);

设置 ConfigurableBeanFactory 和 WebApplicationContext 提供的 SCOPE_XXX 变量,如 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)。

具体设置代码如下:

Java Bean作用域是什么及怎么实现

Java Bean作用域是什么及怎么实现

Java Bean作用域是什么及怎么实现

Bean 的作用域是指 Bean 在 Spring 整个框架中的某种行为模式。Bean 的常见作用域有 5 种:singleton(单例作用域)、prototype(原型作用域)、request(请求作用域)、session(请求作用域)、application(全局作用域),注意后 3 种作用域只适用于 Spring MVC 框架。

关于“Java Bean作用域是什么及怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

文章标题:Java Bean作用域是什么及怎么实现,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/21827

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年8月31日 下午11:14
下一篇 2022年8月31日 下午11:15

相关推荐

  • windows驱动精灵intel显卡dch驱动异常如何解决

    解决方法: 1、右击“此电脑”,点击“管理”。 2、选择左侧任务栏的“设备管理器”。 3、点击右侧任务栏“显示适配器”的下拉,选择“更新驱动程序”。 4、点击下方的“浏览我的计算机以查找驱动程序软件”。 5、接着点击“让我从计算机上的可用驱动程序列表中选取”。 6、选择“Microsoft 基本显示…

    2022年9月13日
    59500
  • windows谷歌浏览器看视频卡顿如何解决

    解决方法: 方法一: 1、在地址栏输入“chrome://plugins”,随后点击右上角的“+详细信息”。 2、选择停用类型为PPAPI的插件,返回视频查看是否有问题。 方法二: 1、点击浏览器右上方的三个带你进入设置界面。 2、进入设置后点击“显示高级设置”, 3、随后取消勾选“关闭Google…

    2022年9月8日
    2.3K00
  • Redis怎么设置生存和过期时间

    在了解原理前 先来看使用方法 通过EXPIRE命令或者PEXPIRE命令,客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间,在经过指定的秒数或者毫秒数之后,服务器就会自动删除生存时间为0的键。 SETEX命令可以在设置一个字符串键的同时为键设置过期时间(只能用于字符串键) 与EXPIRE命令…

    2022年8月30日
    63100
  • sql删除了mdf文件怎么解决

    解决方法: 方法一、用Recover NT 恢复: 它能自动搜索并列出磁盘上有已被完来全删除的文件的目录,而没有被删除文件的目录则不被列出,只需要点四下鼠标就可以了: 1、点击被自删文件所在的驱动器。 2、点击目录。 3、点击文件。 4、点击工具条上的“Recover”按钮,被删文件若没被百覆盖的话…

    2022年9月8日
    57600
  • php如何对数组逆向排序且不保留键名

    实现步骤:1、利用array_reverse()函数对数组进行逆向排序,语法“array_reverse(原数组)”,会返回一个逆向数组;2、使用array_values()函数重置逆向数组的键名,语法“array_values(逆向数组)”,被返回的数组将使用数值键,从0开始且以1递增。 本教程操…

    2022年9月18日
    43000
  • JavaScript怎么取消请求

    取消 XMLHttpRequest 请求 当请求已经发送了,可以使用 XMLHttpRequest.abort() 方法取消发送,代码示例如下: const xhr = new XMLHttpRequest();xhr.open(‘GET’, ‘<http://127.0.0.1:30…

    2022年9月15日
    66000
  • windows edge浏览器关闭没有响应如何解决

    edge浏览器关闭没有响应解决方法: 1、进入edge浏览器,点击右上角三个点依次打开“更多工具—>使用Internet explorer打开”。 2、点击右上方的齿轮设置,点击“Internet 选项”。 3、在“常规”中点击“删除”。 4、将下图中的选确认勾选,并点击删除。 5、右击开始,…

    2022年9月8日
    98200
  • 如何简单绕过人机身份验证Captcha

    今天分享的Writeup是作者在目标网站漏洞测试中发现的一种简单的人机身份验证(Captcha)绕过方法,利用Chrome开发者工具对目标网站登录页面进行了简单的元素编辑就实现了Captcha绕过。 人机身份验证(Captcha)通常会出现在网站的注册、登录和密码重置页面,以下是目标网站在登录页面中…

    2022年9月15日
    3.4K00
  • Nmap运营的示例分析

    背景 随着安全行业的发展,国家的高度重视。各行业遭受着各种各样的威胁,甲方的一些企业自己没有相关的安全部门或者安全能力比较薄弱,就会聘请乙方的安全人员进行运营服务。那么乙方的安全工程师则需要帮助客户去处理一些业务运行过程当中出现的安全事件,比如:出现某个漏洞后需要我们安全工程师去检测一下其他的业务系…

    2022年9月16日
    51800
  • Excel small函数如何使用

    一、函数语法: SMALL(array,k) k 为返回的数据在数组或数据区域里的位置(从小到大)。 array 查找的数据区域。 二、SMALL函数使用实例: 1.数组是A3到A7,从中查找最小数和倒数第二小的数。 2.在C4单元格输人=SMALL(A3:A7,1), 3.回车以后C4单元格取得最…

    2022年9月2日
    54900
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部