首页 > 其他分享 >Bean 的作用域

Bean 的作用域

时间:2024-12-01 13:30:36浏览次数:7  
标签:ClassRoom return Autowired 作用域 private Bean context public

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/Frbedr5APoliaixw3KCc2eM2njg

Bean

通过 @Bean 注解,我们可以将创建的对象交给sping容器来进行管理

首先,让我们先实现一个对象例子

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClassRoom {
    private Integer roomNumber;
    private String msg;

}

@Configuration
public class ClassRoomConfig {
    @Bean
    public ClassRoom classRoom(){
        return new ClassRoom(1,"这是1号教室");
    }
}

@SpringBootTest
public class ConfigTest {
    @Autowired
    private ApplicationContext context;
    @Test
    void classRoomTest(){
        ClassRoom classRoom = context.getBean("classRoom", ClassRoom.class);
        System.out.println(classRoom);
    }
}

默认作用域

Bean是有一个默认的作用域的,而这个作用域采用的是单例模式

我们通过输出对象的地址,来判断,此时是否是同一个实例

@Test
void classRoomTest(){
    ClassRoom classRoom = context.getBean("classRoom", ClassRoom.class);
    classRoom.setMsg("这是美术教室");
    System.out.println(classRoom);

    ClassRoom classRoom2 = context.getBean("classRoom", ClassRoom.class);
    classRoom2.setMsg("这是音乐教室");
    System.out.println(classRoom2);
}

 结果显示,这俩使用的是同一个实例!!!

当然除了默认的单例模式的作用域,也是有其他的作用域的

同时,在某种特殊的情况下,单例模式也是可以声明多个同名称实例的,但是spring会进行覆盖

作用域介绍

根据官方的说法,总共是有六种作用域,其中后面四种是只能使用在web中

同时,因为spring默认是单例模式,在使用其他几种情况时,需要使用特定的注解

作用域

定义

singleTon

单例,这是默认作用域,每一个SpringIoC容器中,相同名称的实例只能有一个

prototype

每次使用bean就会进行创建,这是多例模式,注解:@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)

request

请求时,会创建新的bean,注解:@RequestScope

session

在一个session周期中,都是同一个bean,注解:@SessionScope

application

在一个servletContext周期内,都是同一个bean,注解:@ApplicationScope

webSocket

同一个WebSocket,是同一个bean(这个现版本不支持实现)

在使用这些实例之前,都需要注入实例

@Autowired
private ApplicationContext context;
//方法注入

 同时,使用属性注入时,是在程序启动之前就已经注入完成

        1.singleTon

@Bean
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_SINGLETON)
public ClassRoom single(){
    return new ClassRoom();
}

@Autowired
private ApplicationContext context;
@Autowired
private ClassRoom single;
@RequestMapping("/single")
public String single(){
    ClassRoom single1 = context.getBean("single", ClassRoom.class);
    return "context: "+single1 +" 属性注入: "+single;

}

从结果来看,单例模式下,实例只有一个,此时不管怎么进行刷新,都只会有一个实例,不管是不同的请求,还是不同的session,此时都是一样的 

        2.prototype

@Bean
@Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public ClassRoom prototype(){
    return new ClassRoom();
}

@Autowired
private ApplicationContext context;
@Autowired
private ClassRoom prototype;
@RequestMapping("/prototype")
public String prototype(){
    ClassRoom single1 = context.getBean("prototype", ClassRoom.class);
    return "context: "+single1 +" 属性注入: "+prototype;

}

从结果来看,使用多例模式创建的实例,是使用一次就会变化一次,但是通过属性注入的实例(默认),是没有进行变化的(在此模式下,属性注入只会注入一次,本质上是单例模式的实例)

第一次生成:

 第二次生成:

 

        3.request

@Bean
@RequestScope
public ClassRoom request(){
    return new ClassRoom();
}

@Autowired
private ApplicationContext context;
@Autowired
private ClassRoom request;
@RequestMapping("/request")
public String request(){
    ClassRoom single1 = context.getBean("request", ClassRoom.class);
    return "context: "+single1 +" 属性注入: "+request;

}

结果表明,只要有一次请求时,就会有新的bean生成,同时是属性注入和方法注入都会进行新生成

第一次生成:

第二次生成

        4.session

@Bean
@SessionScope
public ClassRoom session(){
    return new ClassRoom();
}

@Autowired
private ApplicationContext context;
@Autowired
private ClassRoom session;
@RequestMapping("/session")
public String session(){
    ClassRoom single1 = context.getBean("single", ClassRoom.class);
    return "context: "+single1 +" 属性注入: "+session;

}

 结果表示,不同的session会生成不同的实例,同时是属性注入和方法注入都会进行新生成

        5.application

@Bean
@ApplicationScope
public ClassRoom application(){
    return new ClassRoom();
}

@Autowired
private ApplicationContext context;
@Autowired
private ClassRoom application;
@RequestMapping("/application")
public String application(){
    ClassRoom single1 = context.getBean("application", ClassRoom.class);
    return "context: "+single1 +" 属性注入: "+application;

}

结果表示,是没有变化的,貌似可以看作单例模式??但其实他们是有区别的

第一次结果:

第二次结果: 

 区别!!!

单例是一个 ApplicationContext 同一个

application是一个 ServletContext 同一个

(一个Web中可以有多个 ApplicationContext,但是只会有一个 ServletContext)

标签:ClassRoom,return,Autowired,作用域,private,Bean,context,public
From: https://blog.csdn.net/2303_77303297/article/details/144163417

相关文章

  • 从源码角度深入剖析Spring Bean对象创建过程中各后置处理器的作用与实现原理
            springioc容器刷新的过程中涵盖了bean对象的创建流程,再bean对象创建的过程中,使用了哪些后置处理器(扩展接口)?这些后置处理器又有什么作用?下图为spring容器刷新过程中,各处理器的位置。        本文着重对BeanDefinitionRegistryPostProcessor、MergedB......
  • beanshell 断言 jmeter脚本断言json 响应体
    importorg.json.JSONObject;importorg.json.JSONArray;Stringresponse=prev.getResponseDataAsString();try{//将响应字符串转换为JSON对象JSONObjectjsonResponse=newJSONObject(response);//获取code,message和skuList字段intcode......
  • JavaScript第二章,局部变量和全局变量,作用域,闭包1.1
    1.局部变量和全局变量全局变量:在函数外部声明的变量或在任何地方未使用var、let或const关键字声明的变量(这会导致隐式全局变量)都是全局变量。全局变量在整个脚本中都是可访问的。局部变量:在函数内部使用var、let或const关键字声明的变量是局部变量。它们只能在声明它们的函......
  • BeanUtils
    BeanUtils工具由Apache软件基金组织编写,提供给我们使用,主要解决的问题是:把对象的属性数据封装到对象中。Beanutils工具在使用时几乎只用到以下几个方法,其中一个方法通常情况下都是使用匿名内部类。BeanUtils.setProperty(bean,name,value);其中bean是指你将要设置的对象,name......
  • 重拾JS-手写bind(延伸作用域理解,有助于面试)
    简言最近在做前端知识的复习和整理,有了一些自己新的体会。更多在于记录,通过反复的温习,写笔记改变自己以前学习知识点的误区关于Bind,Apply,Call大家本能知道,当函数调用他们的时候就会将函数中的this,显示指向他们的第一个参数(新对象),那么为什么大家在面试或者其他场景下仍然会因......
  • 理解 Python 作用域和命名空间
    在学习Python编程时,掌握作用域(Scope)和命名空间(Namespace)这两个关键概念是非常重要的。这不仅能帮助你更好地理解变量的生命周期与可见性,还能提高你编写高质量代码的能力。本文将深入探讨这两者的含义、区别以及如何在实际编码中应用。什么是命名空间?命名空间是一个存储变量......
  • Spring---Bean的生命周期
    什么是Bean的生命周期Bean的生命周期就是:对象从创建开始到最终销毁的整个过程,Bean对象从创建到销毁中经历了哪些过程什么时候创建Bean对象?创建Bean对象的前后会调用什么方法?Bean对象什么时候销毁?Bean对象的销毁前后调用什么方法?Spring其实就是一个管理Bean对象的工厂,它负......
  • 黑马头条Day4-19启动ApArticleApplication时报错some of the beans in the applicatio
    文章目录1.错误呈现2.错误原因3.解决方案(注入ApArticleService改成注入ApArticleMapper)视频教程:黑马程序员Java项目实战微服务项目《黑马头条》开发全套视频教程,基于SpringBoot+SpringCloud+Nacos等企业级微服务架构项目解决方案1.错误呈现APPLICATIONFAILED......
  • Spring Bean 的生命周期
    原文:如何记忆SpringBean的生命周期参考:一文读懂SpringBean的生命周期建议先了解bean生命周期涉及到的几个常见接口的基本使用:EnvironmentAware、ApplicationContextAware、InitializingBean、BeanPostProcessor1.引言去网上搜“SpringBean的生命周期?”,大多以下......
  • 使用 BeanPostProcessor 进行 bean 初始化增强
    简介BeanPostProcessor是Spring框架中的一个接口,用于在Spring容器初始化bean之前和之后进行一些自定义操作。它允许开发者对bean的实例化过程进行干预,通常用于修改或替换bean的属性、执行特定的初始化逻辑等。下面是接口定义:publicinterfaceBeanPostProcessor{ @......