Bean的存取、五大注解、对象的注入方式、Bean的作用域和生命周期

news2024/12/23 19:43:59

一、Bean 的创建、存储和使用

PS:Java语言中的对象也叫作 Bean。

1、创建一个maven项目

PS:要在 pom.xml 中添加  spring  框架支持

PS:引入 lombok 依赖(可以帮助实现 get 和 set 方法)

 

2、存对象

2.1、创建类

启动类(包含main方法即可):

创建bean:

2.2、写配置文件并定义bean

配置文件:

 注册bean:

3、取对象

PS:ApplicationContext  和  BeanFactory 的区别(两者的效果是一样的,都可以作为 spring 的上下文):
(1)继承关系:ApplicationContext 是 BeanFactory的子类。

(2)性能方面:ApplicationContext 是一次性加载并初始化所有的 Bean 对象;而 BeanFactory 是需要哪个加载哪个,更加轻量。

二、更简单的读存 Bean(通过注解实现)

1、存对象

 1.1、通过五大注解告诉 spring 要管理哪些类

类注解:@Controller、@Service、@Repository、@Component、@Configuration

注解的作用:便于直接了解类的作用。

1.1.1、@Controller(控制器)——表示的是业务逻辑层,接口的最外层,验证参数接口的正确性或者参数的转换、返回。

存储 bean:

读取 bean:

 

1.1.2、@Service(服务)——表示的是服务层,一般是服务的编排和汇总。

存储 bean:

读取 bean: 

1.1.3、@Repository(仓库)——表示的是持久层,一般是数据库。

 

1.1.4、@Component(组件)

 

1.1.5、@Configuration(配置)——表示的是配置层。

 

PS:各注解之间的关系:

各注解的源码:

 

 

 

 通过源码可知,这些注解的注解里都有 @Component,因此说明它们本身就是属于 @Component的子类。

 

1.2、方法注解:@Bean

PS:需要搭配五大注解使用。

 

结果:

 

PS:五大注解和 @Bean 的作用是一样的,都是把对象存到 spring 容器中。

如果一个类无状态(无状态即:不同的线程或者不同的请求,我们创建的对象都是一样的,密钥个性化的属性),就是用五大注解。(一般情况下使用五大注解更多一些) 

 如果一个类,有个性化的内容、有状态,就可能存在多个对象,此时就使用 @Bean 。

 

三、从Spring 中取对象(对象的注入)

1、属性注入——通过 @Autowired 注入,将 Service 类注入到 Controller类中。

结果:

 

2、Setter 注入

PS:在设置 set 方法时要加上 @AutoWired 注解。

3、构造方法注入(构造函数注入)

结果:

 

 PS:如果只有一个构造函数,就不需要加@AutoWired;如果不只有一个构造函数,就需要使用@AutoWired告诉 Spring 使用哪个构造函数。

PS:构造函数可以注入多个对象,它使用 @AutoWired 去查找对象,若一个类型有一个对象时,就使用 @Qualifier 去知道使用。 

4、命名规则

4.1、Spring 存

(1)、五大注解

若前两个字母都是大写,那么就是类名。

其他情况类名都是小写。

(2)、@Bean

命名是方法名。

5、优缺点

5.1、属性注入

优点:简洁、使用方便。

缺点:只能用于 IoC 容器,如果是非 IoC 容器不可用,且只有在使用时才会出现 NPE(空指针异常);不能注入一个 final 修饰的属性(final 修饰的属性需要满足:在定义时就进行初始化;构造函数进行初始化)。

5.2、setter 注入

优点:方便在类实例之后重新对该对象进行配置或注入。(Spring 3.x推荐使用的)

缺点:不能注入一个 final 修饰的属性;注入对象可能会被修改,因为 setter 方法可能会被多次调用,就有被修改的风险。

5.3、构造方法注入

优点:可以注入一个 final 修饰的属性;注入的对象不会被修改;依赖对象在使用前一定会被完全初始化(依赖实在类的构造方法中执行的,构造方法是在类加载阶段就会执行的方法);通用性好(Spring 4.x推荐使用的),构造方法是JDK支持的,所以换任何框架都是使用的。

缺点:注入多个对象时代码会比较繁琐。

 6、一种注入关键字:@Resource

在进行类注入时,处理可以使用 @AutoWired 关键字进行注入,还可以使用 @Resource 关键字。 

PS:如果没有指定名称,就根据类型匹配;若指定了名称,就根据名称匹配。

 PS :@AutoWired 和 @Resource 的区别:
(1)来源不同:@AutoWired 来自于Spring ;@Resource 来自于JDK的注释。

(2)参数设置不同:相比于@AutoWired,@Resource 支持更多的参数设置。

(3)@AutoWired 可以用属性注入、构造函数注入、setter 注入;@Resource 只能用于属性注入和 setter 注入,不能用于构造函数注入。

四、Bean 的作用域

1、定义

Bean 的作用域指的是 Bean 在这个Spring 框架中的某种行为模式。

2、作用域

 singleton(单例作⽤域) 、prototype(原型作⽤域(多例作⽤域)) 、 request(请求作⽤域) 、 session(会话作⽤域) 、application(全局作⽤域) 、websocket(HTTP WebSocket 作⽤域)
PS:在普通的 Spring 项目中只有前两种,后四种状态是 Spring MVC 中的值(基于 Spring MVC 生效 )。

2.1、singleton :单例作用域

描述:该作用域下的 Bean 在IoC 容器中只存在一个实例。该作⽤域下的Bean在IoC容器中只存在⼀个实例:获取Bean(即通过 applicationContext.getBean等⽅法获取)及装配Bean(即通@Autowired注⼊)都是同⼀个对象。 

场景:通常无状态的  Bean 使用该作用域。(无状态表示 Bean 对象的属性状态不需要更新)

2.2、prototype :原型作用域

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

场景:通常有状态的  Bean 使用该作用域。

2.3、request :请求作用域

描述:每次http请求会创建新的Bean实例,类似于prototype。

场景:⼀次http的请求和响应的共享Bean

2.4、session :会话作用域

描述:在⼀个http session中,定义⼀个Bean实例

场景:⽤户回话的共享Bean, ⽐如:记录⼀个⽤户的登陆信息

2.5、application :全局作用域

描述:在⼀个http servlet Context中,定义⼀个Bean实例

场景:Web应⽤的上下⽂信息,⽐如:记录⼀个应⽤的共享信息。

2.6、websocket :HTTP WebSocket作用域

描述:在⼀个HTTP WebSocket的⽣命周期中,定义⼀个Bean 实例。

场景:WebSocket的每次会话中,保存了⼀个Map结构的头信息,将⽤来包裹客户端消息头。第⼀次初始化后,直到 WebSocket 结束都是同一个Bean 。

五、Bean 的生命周期

1、Spring 的执行流程

(1)启动 Spring 容器

 

(2)根据配置文件进行 Bean 的初始化

 

(3)存:把这些对象放进 Spring 容器中

(4)取:装配对象(把依赖对象注入进去)

2、Bean 的生命周期

2.1、生命周期

(1)实例化 Bean(为Bean分配内存空间)

(2)设置属性(Bean注入和装配)

(3)Bean 初始化:执行各种通知(如一些接口方法);执行初始化前置方法(xml定义init-method、使用注解的方式@PostConstruct);执行初始化方法;执行初始化后置方法。

(4)使用 Bean

(5)销毁 Bean(如:单例作用域会在容器销毁时销毁 Bean 。请求作用域会在请求结束时就销毁Bean。)

 2.2、代码实现

 结果:

 

PS:先执行PostConstruct,再执行init-method。先执行注解,再执行xml。

 PS:PostConstruct 和 PreDestroy区别:

PostConstruct 在构造函数之后执行、在init 方法之前执行。PreDestroy 在 Destroy方法之前执行。

 具体可参考:注解@PostConstruct与@PreDestroy使用讲解 - 知乎 (zhihu.com)

 

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

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

相关文章

Linux 蜂鸣器驱动实验

蜂鸣器驱动原理 ①、在设备树中添加 SNVS_TAMPER1 引脚的 pinctrl 信息。 ②、在设备树中创建蜂鸣器节点,在蜂鸣器节点中加入 GPIO 信息。 1、修改设备树文件 添加 pinctrl 节点 I.MX6U-ALPHA开发板上的BEEP使用了SNVS_TAMPER1这个PIN,打开imx6ull-alien…

【01】C++的第一个程序Hello World

C的第一个应用程序(Hello World程序) 引言一、代码二、代码解释三、注意事项总结 引言 💡 作者简介:专注于C/C高性能程序设计和开发,理论与代码实践结合,让世界没有难学的技术。 👉 &#x1f39…

报表生成工具Stimulsoft Reports.JS如何减少产品脚本的加载时间

Stimulsoft Reports 是一款报告编写器,主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署,如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等,在你的应用程序中嵌入报告设计器…

Django框架之视图HttpResponse 对象

本篇文章主要内容为:视图中HttpResponse对象的属性、方法及json、redirect子类包含使用cookie使用、跳转、json返回的示例。 概述 HttpResponse对象是对用户访问的响应,与HttpRequest对象由django创建,HttpResponse对象是由开发人员创建。Ht…

001+limou+MySQL的基础命令

0.前言 您好,这里是limou3434的一篇个人博文,感兴趣的话您也可以看看我的其他文章。本博文是借鉴于李小威前辈所著的书籍《SQL 基础教程》所成的博文笔记,这本书真的很适合新手学习数据库相关的内容。本次我想给您带来的是关于MySQL的一些基…

网站神奇工具Viewport Resizer,支持手机、pad和电脑等不同尺寸大小

标题:Viewport Resizer:让网站适应不同设备的神奇工具! 导语: 在互联网世界中,我们常常需要在不同设备上浏览网站。为了让用户在手机、平板或电脑上都能看到美观易用的页面,网站开发者们努力优化网站的适应…

qemu-虚拟机

qemu 官网下载地址 https://www.qemu.org/ 跨平台虚拟机,类型vmware,执行效率比vmware高 官方参考文档:https://www.qemu.org/docs/master/system/introduction.html kvm,轻量级虚拟机,可以加速qemu的执行 qemu-e…

微信云开发技术架构

(仅有把抱怨环境的情绪,化为上进的力量,才是成功的保证。——罗曼罗兰) 微信云开发 官方文档 文本只用来概述微信云开发的技术架构,并结合实战场景进行说明。更详细的请直接查看微信官方文档。 背景 微信云开发是微…

Oracle11g全新讲解之游标

游标 游标的作用:处理多行数据,类似与java中的集合 1.隐式游标 一般是配合显示游标去使用的,不需要显示声明,打开,关闭,系统自定维护,名称为:sql 常用属性: sql%found:语句影响了…

快速分隔文件(split),合并文件(paste)的命令;eval(先扫描输出在执行)命令

split快速分割文件,paste快速合并文件;eval命令 split命令快速分隔文件paste命令快速合并文件eval命令 split命令快速分隔文件 语法格式: split 【选项】 参数 原始文件 拆分后文件名前缀 常用选项 -l:以行数拆分 -b&#xf…

7.对象模型

对象模型 信号和槽 信号和槽是一种用于对象之间通信的机制。信号是对象发出的通知,槽是用于接收这些通知的函数。 当对象的状态发生变化时[按钮被点击],它会发出一个信号[clicked()],然后与该对象连接的槽函数将被自动调用。 若某个信号与多…

图像分割之SAM(Segment Anything Model)

论文:Segment Anything Github:https://github.com/facebookresearch/segment-anything 论文从zero-shot主干网络的基础出发,提出了SAM(Segment Anything Model)模型。该模型有别于传统的分割模型。传统分割模型只能输…

正则表达式的一些元符号

正则表达式 正则表达式—通常用于判断语句中,用来检查某一字符串是否满足某一格式 正则表达式是由普通字符与元字符组成 普通字符包括大小写字母、数字、标点符号及一些其他符号元字符是指在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字…

(数字图像处理MATLAB+Python)第四节:频域高通滤波与综合案例

文章目录 一:频域高通滤波(1)理想的高通滤波器(2)巴特沃斯高通滤波器(3)指数高通滤波器(4)梯形高通滤波器 二:综合案例——人像美化(1&#xff09…

vue2实现高德地图 JSAPI 2.0海量点标记(标注和标注图层)->自定义点位->定时刷新点位

前提: 需要注册高德开放平台,之后创建应用并且开通Web端(JS API)平台,然后拿到securityJsCode和key 1. 基础抽取(还原示例) 1.1 组件代码 代码说明: 需要修改securityJsCode和key为自己的allowCollision为标注是否避让marker,默认为false不避让markers为地图上的标记数组layer…

【Axure教程】中继器表格寻找和标记数据

在系统表格中,我们想在表格中快速找到对应的数据,通常我们会用条件筛选来完成,但是用筛选的方式,其他数据就看不到了,少了两种条件之间的对比。所以如果需要数据对比的情况下,我们更多的是用标记数据的方式…

Unity学习笔记 关于Unity相机的FOV以及水平FOV和垂直FOV之间的转换

前言 关于FOV FOV 是在任何给定时间通过人眼、相机取景器或在显示屏上可见的可观察世界的范围。它指的是整个区域的覆盖范围,而不是单个固定焦点。FOV 还描述了一个人可以看到可见世界的角度。 FOV 越宽,可以看到的可观察世界就越多。它是水平、垂直和对…

vue3中使用外部字体

首先要找一个免费网站,去下载你想用的字体,推荐 DaFont - Download fonts 或者问UI要,ui在设计图的时候也会下载对应的特殊字体的包,所以问她要方便快捷 ~~ 如果是进入网站下载的话,操作步骤如下: 在官网…

MTN模型LOSS均衡相关论文解读

一、综述 MTN模型主要用于两个方面,1.将多个模型合为一个显著降低车载芯片负载。2.将多个任务模型合为一个,有助于不同模型在共享层的特征可以进行互补,提高模型泛化性能的同时,也有可能提高指标。传统的方法是直接不同任务loss相…

谷歌打响全面反击战!官宣AI重构搜索、新模型比肩GPT-4,朝着ChatGPT微软开炮

明敏 丰色 发自 凹非寺 量子位 | 公众号 QbitAI 万众瞩目,谷歌的反击来了。 现在,谷歌搜索终于要加入AI对话功能了,排队通道已经开放。 当然这还只是第一步。 大的还在后面: 全新大语言模型PaLM 2正式亮相,谷歌声称…