探究Spring Bean的六种作用域:了解适用场景和使用方式

这里写目录标题

主要对单例作用域与原型作用域进行重点说明,其余四个了解即可

单例(Singleton)作用域:

单例作用域一般是默认的Bean作用域。Spring容器在第一次获取Bean时创建实例,并在后续请求中返回同一个实例。

例如:

我们现在创建一个公共的Bean供用户一与用户二使用,用户一再使用完后对其内容进行修改,后被用户二使用,查看Bean是否改变,即可查看Bean的作用域。

公共的Bean:

java 复制代码
@Component
public class Users {
   private User user;
    @Bean
    public User user1(){
       user= new User(1);
       user.setName("zcx");
       return user;
    }
}

用户一使用时进行修改操作:

java 复制代码
@Controller
public class BeanScopesController {
    @Autowired
    private User user;
    public  User getUser(){
        User user1 = user;
        System.out.println(user1.toString()+"这是修改之前的");
        user1.setName("java");
        return  user1;
    }
}

用户二再去使用Bean:

java 复制代码
@Controller
public class BeanScopesController2 {
    @Autowired
    private User user2;
    public  User getUser2(){
        User user = user2;
        return user;
    }
}

打印用户一与用户二共用Bean的值:

java 复制代码
public class demo {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
            BeanScopesController beanScopesController = context.getBean(BeanScopesController.class);
        System.out.println(beanScopesController.getUser().toString()+"这是第一个调用对象修改之后的");
        BeanScopesController2 beanScopesController2 = context.getBean(BeanScopesController2.class);
        System.out.println(beanScopesController2.getUser2().toString()+"这是第二个对象调用之后的");

    }
}

进行结果打印:

通过结果我们发现用户一修改过的值在用户二中也出现了,已经不是初始的值了。

所以说明Bean 默认情况下是单例状态(singleton),也就是所有用户的使⽤的都是同⼀个对象。

原型(Prototype)作用域:

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

可以使⽤ @Scope 标签⽤来修改Bean 的作⽤域,例如:

java 复制代码
@Component
public class Users {
   private User user;
   @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean
    public User user1(){
       user= new User(1);
       user.setName("zcx");
       return user;
    }
}

通过跟前面一样的代码打印结果如下:

通过结果我们知道Bean的作用域已经由单例模式修改为原型模式也就是多例模式

当然@Scope 标签有两种设置⽅式:

  1. 直接设置值:@Scope("prototype")
  2. 使⽤枚举设置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

请求(Request)作用域:

每次http请求会创建新的Bean实例,类似于prototype,⼀次http的请求和响应的共享Bean,限定SpringMVC中使⽤

会话(Session)作用域:

在⼀个http session中,定义⼀个Bean实例,⽤户回话的共享Bean,限定SpringMVC中使⽤

全局(application)作用域:

在⼀个http servlet Context中,定义⼀个Bean实例,使用于Web应⽤的上下⽂信息,限定SpringMVC中使⽤

HTTP WebSocket 作⽤域

在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean实例,WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到WebSocket结束都是同⼀个Bean,限定Spring WebSocket中使⽤

相关推荐
m0_639906946 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
2501_944521596 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
楚山之石7 小时前
【Medical Image Analysis】深度学习医学图像合成综述:伪CT、合成MRI与合成PET的架构、性能与临床边界
图像处理·人工智能·学习·mr·mri
holly就是我7 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
鸿蒙开发7 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
用户788477316347 小时前
小程序后端三选一:云开发、.NET WebAPI、Node,我按客户现状分了三种答案
后端
aiopencode7 小时前
局域网设备抓包怎么做?用 TraceEagle 抓电视、游戏机和 IoT 流量
后端·ios
智驭未来掌门人7 小时前
CLion 开发 Qt 项目的优势
后端
EnCi Zheng7 小时前
后端怎么把AI接口稳定安全低成本接进业务:超时重试、密钥隔离与成本熔断清单
人工智能·后端·安全·架构·api
Bazingga7 小时前
从一家酒店讲懂Docker
后端