探究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中使⽤

相关推荐
冰淇淋烤布蕾6 分钟前
EasyExcel使用
java·开发语言·excel
行然梦实9 分钟前
学习日记_20241110_聚类方法(K-Means)
学习·kmeans·聚类
拾荒的小海螺12 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
马船长15 分钟前
制作图片木马
学习
秀儿还能再秀26 分钟前
机器学习——简单线性回归、逻辑回归
笔记·python·学习·机器学习
Jakarta EE29 分钟前
正确使用primefaces的process和update
java·primefaces·jakarta ee
WCF向光而行31 分钟前
Getting accurate time estimates from your tea(从您的团队获得准确的时间估计)
笔记·学习
马剑威(威哥爱编程)37 分钟前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
java—大象1 小时前
基于java+springboot+layui的流浪动物交流信息平台设计实现
java·开发语言·spring boot·layui·课程设计
wang09071 小时前
工作和学习遇到的技术问题
学习