Bean的作用域和生命周期(Bean是线程安全的吗?Spring如何在并发情况下获取不完整的Bean...)

news2024/10/6 5:55:49

@Bean 注解是 Spring 框架中的一个注解,用于告诉 Spring 容器需要将被注解修饰的方法的返回值注册为一个 Bean。通常情况下,Spring 容器会自动扫描并创建带有 @Component 或其他类似注解的类,并将这些类的实例注册为 Bean。但对于某些特殊情况,我们可能需要手动配置某个对象的实例,或者需要调用一些特定的初始化逻辑来创建对象。这时就可以使用 @Bean 注解。总结一下,@Bean 注解用于告诉 Spring 容器需要注册一个 Bean,并提供了一个方法来创建该 Bean 的实例。通过 @Configuration 注解的配置类中使用 @Bean 注解,可以手动配置和创建特定的 Bean 实例,并在其他地方使用依赖注入的方式获取和使用这些 Bean。

Spring 是⽤来读取和存储 Bean,因此在 Spring 中 Bean 是最核⼼的操作资源,Bean是线程不安全的。

0.Lombok

0.1 了解Lombok 

Lombok是一个Java库,它可以通过注解减少Java类中的样板代码。使用Lombok可以简化代码编写,提高开发效率。

以下是Lombok库的一些常用注解及其功能:

1. `@Getter` / `@Setter`: 自动生成字段的Getter和Setter方法。

2. `@ToString`: 自动生成toString方法。

3. `@EqualsAndHashCode`: 自动生成equals和hashCode方法。

4. `@NoArgsConstructor`: 自动生成无参构造方法。

5. `@AllArgsConstructor`: 自动生成全参构造方法。

6. `@Data`: 包含了`@Getter`、`@Setter`、`@ToString`、`@EqualsAndHashCode`和`@AllArgsConstructor`的组合注解,用于快速生成Getter、Setter、toString、equals、hashCode方法和全参构造方法。

除了上述注解外,Lombok还提供了很多其他常用的注解,如 `@NonNull`(标记字段不能为空)、`@Builder`(生成Builder模式的构造器)、`@Slf4j`(自动生成Logger对象)等。

使用Lombok时,需要在项目中添加Lombok的依赖,并在IDE中安装Lombok插件,以便支持注解的自动生成。

下面是一个使用Lombok的例子:


import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
}

在上述代码中,使用了`@Data`注解,它包含了`@Getter`、`@Setter`、`@ToString`、`@EqualsAndHashCode`和`@AllArgsConstructor`注解的功能。因此,不需要手动编写Getter、Setter、toString、equals、hashCode方法和全参构造方法,Lombok会自动帮我们生成这些代码。

0.2 将Lombok配置到idea

 从maven中央仓库中搜索lombok,点击引用量最高的,找到1.18.24版本,复制到pom.xml

  <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
            <scope>provided</scope>
 </dependency>

在idea中的File的setttings中下载lombok

1. 代码感受Bean的作用域

1.1 被修改的代码

1.1.1 设计思路

公共类UserBean的作者张三,类中设置name="zhangsan",id=1;

UserController1作者李四,通过使用setname修改,使得name="lisi";

UserController2作者王五,打印user,结果发现打印出来的name="lisi",而不是我们正常逻辑上的zhangsan.由此引出我们思考.......

1.1.2 代码

//Lombok注解,先从maven仓库中引入依赖,然后在settings中下载lombok插件
//@Data注解中就包含了他的哈希,tiString,get和set方法
@Data
public class User {
    int id;
    String name;
    String password;

}
//作者:张三
@Component
public class UserBeans {
    @Bean
    public User user(){
        User user=new User();
        user.setId(1);
        user.setName("zhangsan");
        user.setPassword("1234");
        return user;
    }
}
//作者:李四
@Controller
public class UserController1 {
    @Resource
    private User user1;
    public void getUser(){
        System.out.println("张三:"+user1);
        User user2=user1;
        user2.setName("lisi");
        System.out.println("李四:"+user2);
    }
}
//作者:王五
@Controller
public class UserController2 {
    @Resource
    private User user1;
    public void getUser(){
        System.out.println("王五:"+user1);
    }
}
public class MainApp {
    public static void main(String[] args) {
        // 加载Spring配置文件即创建Spring上下文;
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserController1 u1=context.getBean("userController1", UserController1.class);
        u1.getUser();
        UserController2 u2=context.getBean("userController2", UserController2.class);
        u2.getUser();



    }
}

1.1.3 观察现象

1.2 分析原因

 操作以上问题的原因是因为 Bean 默认情况下是单例状态(singleton),所有⼈的使⽤的都是同⼀个对象(使⽤单例可以很⼤程度上提⾼性能,所以在 Spring 中 Bean 的作⽤域默认是 singleton 单例模式

所以在上述作者为王五时就没有打印出zhangsan,而是被修改后的name ->"lisi"!

2. Bean的六种作用域

2.1 普通Spring项目中的作用域

singleton(Spring默认的作⽤域)——单例模式

该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过
applicationContext.getBean等⽅法获取)及装配Bean(即通过@Autowired注⼊)都是同⼀
个对象。 通常⽆状态的Bean使⽤该作⽤域(⽆状态:Bean对象的属性状态不需要更新)

prototype——多例模式

proto中文含义:原生的;

每次对该作用域下的Bean的请求都会创建新的实例,获取Bean和装配Bean都是新的实例对象

该作用域适用于有状态的Bean(每次请求都会创建一个新的Bean实例。每次调用getBean()方法时,都会返回一个新的实例)

 2.2 

请求作用域:request

每次http请求都会创建新的Bean实例,类似于原型模式

限定在MVC/Web中使用,适用于一次http请求和响应的共享Bean

会话作用域(session)

再一次http session 中定义一个Bean实例

用户共享Bean,比如记录用户的登录信息,限定在MVC中使用

全局作用域(application)

在一个http servlet Context中定义一个Bean实例

使用场景:Web应用的上下文信息,比如记录一个应用的共享信息,限定在MVC中使用

作用于servlet容器

websocket

网络长连接,在一个HTTPWebSocket的生命周期中,定义一个Bean实例

使用场景,在WebSocket的每次会话中,保存了一个Map结构的头信息,用来包裹客户端头信息,第一次初始化后,知道WebSocket结束,都是同一个Bean,限定在Spring WebSocket中使用
 

2.3单例作⽤域(singleton)和全局作⽤域(application)区别💀

singleton 作⽤于 IoC 的容器,⽽ application 作⽤于 Servlet 容器。

singleton 是 Spring Core 的作⽤域;application 是 Spring Web 中的作⽤域; 

3.设置作用域(Spring如何在并发情况下获取不完整的Bean)

以改为多例模式的prototype为例

写法一:@Scope("prototype")

写法二:@Scope(

ConfigurableBeanFactory.SCOPE_PROTOTYPE

)

打印结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1076634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

iPhone手机上使用的定时提醒APP是哪个

在日常喧闹的生活和工作中&#xff0c;琐碎的任务会像喷泉一样突涌而至&#xff0c;如不及时规划&#xff0c;我们将陷入手足无措的境地。而想要让各项工作任务按时完成&#xff0c;我们可以借助一些比较好用的时间提醒软件来督促各项任务。 就拿常用的iPhone手机来讲&#xf…

Tomcat隔离web原理和热加载热部署

Tomcat 如何打破双亲委派机制 Tomcat 的自定义类加载器 WebAppClassLoader 打破了双亲委派机制&#xff0c;它首先自己尝试去加载某个类&#xff0c;如果找不到再代理给父类加载器&#xff0c;其目的是优先加载 Web 应用自己定义的类。具体实现就是重写 ClassLoader 的两个方法…

九小场所“一店一码”消防安全监管如何制作

将九小场所信息在凡尔码平台生成消防安全码落地粘贴场所&#xff0c;微信扫码了解场所以往消防安全检查情况、整改情况&#xff1b;同时也可以了解学习消防安全知识&#xff1b;“一店一码”实现场所消防安全动态管理。 监管部门检查微信扫码即可填写检查记录&#xff0c;有隐…

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f95e;网卡设备接入输入子系统&#x1f354;测试 &#x1f95e;业务子系统&#…

Astronomaly:利用 CNN 和主动学习识别 400 万张星系图像中的异常

星系中的异常现象是我们了解宇宙的关键。然而&#xff0c;随着天文观测技术的发展&#xff0c;天文数据正以指数级别增长&#xff0c;超出了天文工作者的分析能力。 尽管志愿者可以在线上参与对天文数据的处理&#xff0c;但他们只能进行一些简单的分类&#xff0c;还可能会遗漏…

数字孪生与GIS数据为何高度互补?二者融合后能达到什么样的效果?

山海鲸可视化作为一款数字孪生软件&#xff0c;在GIS的融合方面处于业内领先水平&#xff0c;那么为什么一款数字孪生软件要花费巨大的精力&#xff0c;去实现GIS的融合&#xff0c;实现后又能达到什么样的效果呢&#xff1f;下面就让我们来一探究竟。 一、为什么数字孪生需要…

OpenCV级联分类器识别车辆实践笔记

1. OpenCV 级联分类器的基本原理 基于Haar特征的级联分类器的目标检测是Paul Viola和Michael Jones在2001年的论文中提出的一种有效的目标检测方法。这是一种基于机器学习的方法&#xff0c;从大量的正面和负面图像中训练级联函数。然后用它来检测其他图像中的物体。 Haar特征…

终于找到了!多种类型的电子期刊模板在这里!

经过我不懈的努力和搜寻&#xff0c;终于找到了一个提供多种类型电子期刊模板的网站。这个网站拥有丰富多样的模板&#xff0c;可以满足各种不同的需求&#xff0c;无论是学术研究、商业报告还是个人兴趣爱好&#xff0c;都能在这里找到心仪的模板。 一、网站介绍 这个网站叫做…

弧形进度条,弧形百分比

要帮助同事写一个弧度的进度条&#xff0c;进度条顶部有一个小圆&#xff0c;具体如下 需要指出的是&#xff0c;我们canvas的绘制是需要弧度&#xff0c;所以我们代码中使用角度&#xff0c;等待绘制的时候再砖话为弧度值 <!DOCTYPE html> <html lang"en"…

【MATLAB源码-第45期】基于matlab的16APSK调制解调仿真,使用卷积编码软判决。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 16APSK调制解调 16APSK (16-ary Amplitude Phase Shift Keying) 是一种相位调制技术&#xff0c;其基本思想是在恒定幅度的条件下&#xff0c;改变信号的相位&#xff0c;从而传送信息。 - 调制&#xff1a;在16APSK中&am…

【angular】TodoList小项目(已开源)

参考&#xff1a;https://segmentfault.com/a/1190000013519099 文章目录 准备工作headerTodo、Doing、Done样式&#xff08;HTMLCSS&#xff09;功能&#xff08;TS&#xff09;将输入框内容加入todoList&#xff08;addTodo&#xff09;将todo事件改到doing 服务 参考 效果&a…

C语言基础 C++

C语言基础 C 嘿&#xff0c;你想起点C基础知识&#xff0c;这是一个很好的开始&#xff01;C是一种通用的编程语言&#xff0c;被广泛用于开发各种应用程序&#xff0c;从简单的控制台程序到复杂的桌面应用和游戏开发。现在让我带你进入C的奇妙世界&#xff0c;看看它有什么特…

OBIA:900+ 患者、193w+ 影像,中科院基因组所发布我国首个生物影像共享数据库

看病就医&#xff0c;拍片已是常例。CT、核磁、X 光等影像资料可以用非侵入式手段透过人体&#xff0c;使内部器官、组织状况清晰可见&#xff0c;为临床诊断和疾病治疗提供可靠依据。 随着医学影像技术广泛发展&#xff0c;影像资料已占据国内医疗数据的 80% 以上&#xff0c…

Android平台GB28181设备接入侧如何实现SIP校时

规范解读 GB/T28181-2016规范里面&#xff0c;9.10.1章节&#xff0c;关于校时基本要求&#xff1a; 联网内设备支持基于SIP方式或 NTP方式的网络校时功能&#xff0c;标准时间为北京时间。 SIP方式校时见本节具体描述&#xff1b;NTP(见IETFRFC2030)协议的网络统一校时服务…

【通信系列 2 -- 射频电路介绍】

文章目录 1.1 射频电路介绍1.1.1 射频电路的原理1.1.2 射频电路组成和特点 1.1 射频电路介绍 射频&#xff08;RF&#xff09;是Radio Frequency的缩写&#xff0c;表示可以辐射到空间的电磁波频率&#xff0c;频率范围从300kHz&#xff5e;300GHz之间。射频就是射频电流&…

美瞳小程序经营配送商城的作用是什么

美瞳是不少小姑娘喜爱的产品&#xff0c;线上线下需求都比较旺盛&#xff0c;尤其是新款或极其漂亮的产品往往会成为疯抢的对象&#xff0c;当然市场高需求的同时商家也面临着一些难题。 通过【雨科】平台搭建美瞳商城小程序&#xff0c;将所有产品线上售卖&#xff0c;摆脱第三…

复亚智能广东智慧应急项目案例:构建“空地一体化”

近日&#xff0c;广东某区深入探索“智慧应急”发展模式&#xff0c;将无人机作为赋能应急处突与“智慧应急”的重要手段&#xff0c;利用复亚智能无人机全自动飞行系统做到“平时巡查巡检、急时辅助处突”&#xff0c;实现全面监管快速响应&#xff0c;无人机自动巡检结合多样…

Web API 基础 (Web Workers API)

Web Workers API 1、指南 1.1 使用Web Workers Web Workers是一种让Web内容在后台线程中运行脚本的简单方法。工作线程可以在不干扰用户界面的情况下执行任务。此外&#xff0c;它们还可以使用XMLHttpRequest(尽管responseXML和channel属性总是为空)或fetch(没有此类限制)执…

XPS测试仪器-科学指南针

在做 X 射线光电子能谱(XPS)测试时&#xff0c;科学指南针检测平台工作人员在与很多同学沟通中了解到&#xff0c;好多同学仅仅是通过文献或者师兄师姐的推荐对XPS测试有了解&#xff0c;但是对于其测试仪器还属于小白阶段&#xff0c;针对此&#xff0c;科学指南针检测平台团队…

ant design form数组修改 关联展示

根据form 数组项修改关联其他选项 如图&#xff0c;在项目开发中&#xff0c;每个form中有多个产品&#xff0c;提货方式不同&#xff0c;有一个需要邮寄展示收货地址&#xff0c;否则不用展示 // An highlighted block <Card title"产品信息" bordered{false}&g…