Bean的作用域

文章讨论了Spring框架中Bean的作用域问题,特别是单例模式和原型模式。在单例模式下,Bean在应用中只有一个实例,可能导致多个组件共享同一对象导致数据冲突。而原型模式允许每次请求时创建新实例,避免了上述问题。通过@Scope注解可以设置Bean的作用域,例如使用prototype或ConfigurableBeanFactory.SCOPE_PROTOTYPE来定义多例模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例1:

如果有一个Bean对象,对象注入给两个类,其中一个类(A)不对其进行修改,一个类(B)修改了Bean对象中的数据,在使用的时候,就会导致A拿到的是修改以后的数据,拿不到修改前的数据。
但是正常来说应该是B修改了以后 也只是修改自己,不应该影响A的使用。

Bean对象👇

package com.demo.component;

import com.demo.model.User;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller
public class UserBeans {
    //Bean作用域设置
    //1.枚举设置
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    //2.全局设置
    //@Scope("prototype")
    //扫描根 扫描路径 注册Bean对象
    @Bean
    public User user() {

        User user = new User();
        user.setId(1);
        user.setName("zyz");
        user.setPassword("123456");
        return user;
    }
}

A类👇

package com.demo.controller;

import com.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * author:zyz
 */

@Controller
public class User1Controller {
    @Autowired
    private User user;

    public void getUser() {
        //属性注入 获取到bean 就是之前UserBeans设置的zyz
        System.out.println("user: "+user);
    }
}

B类👇

package com.demo.controller;

import com.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Controller;

/**
 * author:wxy
 */
@Controller
public class UserController {

    //属性注入 获取Bean对象
    @Autowired
    private User user1;

    public void getUser() {
        System.out.println("user:"+user1);//zyz
        //修改一下拿到的user
        User u = user1;
        u.setName("wxy");
        System.out.println("u:"+u);//wxy
    }
}

执行结果👇
在这里插入图片描述
这是因为Bean默认的模式是单例模式(singleton),也就是在使用同一个对象,使用Bean的时候,因为Bean对象已经存在,所以并不会创建一个新的Bean对象来使用,所以本质还是在使用那个对象。
使用单例模式(singleton)可以提高性能,Spring中的Bean作用域也就是单例模式,是默认的。

如果我们希望不使用单例模式,我们就可以设置Spring的Bean作用域。

Bean作用域及作用域设置

1.作用域定义

程序中变量的可用范围就叫做作用域。
单例作用域指的是在Spring中只有这一份Bean,修改后,读取的时候就是修改后的数据,并不会创建新的Bean,读取到原始值。

2.作用域分类(6种)

1.singleton——单例作用域(Spirng中Bean的默认作用域)
2.prototype——多例作用域
3.request——请求作用域
4.session——回话作用域
5.application——全局作用域
6.websocket——WebSocket作用域
前两种在Spring中,后面4种是在Spring MVC的

3.设置作用域

使用@Scope来设置
如果要设置为多例作用域👇
其中@Scope(“prototype”)是全局设置
@Scope(ConfigurableBeanFactory.SCOPE.PROTOTYPE)是枚举设置

package com.demo.component;

import com.demo.model.User;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller
public class UserBeans {
    //Bean作用域设置
    //1.枚举设置
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    //2.全局设置
    //@Scope("prototype")
    //扫描根 扫描路径 注册Bean对象
    @Bean
    public User user() {

        User user = new User();
        user.setId(1);
        user.setName("zyz");
        user.setPassword("123456");
        return user;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

keild

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值