SpringBean管理
一.什么是SpringBean?
在Spring中将管理对象称为 Bean.Bean是由一个SpringIOC容器实例化,组装和管理的对象.也就是说,Bean并不是由我们程序员编写的,而是在程序运行过程中,由Spring通过反射机制生成的.
SpringBean是Spring框架在运行时管理的对象,我们编写的大多数逻辑代码都会存放在SpringBean中.
二.SpringBean管理的内容
SpringBean的管理包括:
-
创建一个对象
-
提供依赖项(例如其他bean,配置属性)
-
拦截对象方法调用以及提供额外的框架功能
-
摧毁一个对象
三.SpringBean管理的方式
SpringBean有两种管理方式:
-
基于XML文件的配置
-
使用注解
SpringBean属性列表:
-
id: Bean的唯一标识符,Spring容器对Bean的配置,管理都通过该属性进行.
-
name:
Spring容器通过此属性进行配置和管理,name属性可以为Bean指定多个名称,每个名称之间使用逗号或者分号分开
-
class: 指定Bean的实现类,它必须使用类的全限定名
-
scope: 用于设定Bean示例的作用域,其属性值如下:
-
singleton: 单例的.即只创建一个对象,在Spring启动时就会创建好.
-
prototype: 原型的.每次都会创建一个对象,在获取时才会创建.
-
-
constructor-arg: <Bean>元素的子元素.可以使用此元素传入构造参数进行实例化
-
property: <Bean>元素的子元素.用于调用Bean实例中的setter()方法完成属性赋值,从而完成依赖注入.
-
name属性指定Bean实例中的相应属性名
-
ref属性及value属性用于指定参数值
-
-
ref: <constructor-arg>,<property>等元素的属性或子元素,可以用于指定Bean工厂中某个Bean’实例的引用
-
value: <constructor-arg>,<property>等元素的属性或子元素,可以用于直接给定一个常量值
-
list: 用于封装List或数组属性的依赖注入
-
set: 用于封装Set类型属性的依赖注入
-
map: 用于封装Map类型的依赖注入
-
entry:
元素的子元素,用于设置一个键值对,其key属性指定字符串类型的键值.ref属性或value属性直接指定其值.也可以通过ref或者value子元素指定其值.
1.使用XML文件
-
使用xml文件进行SpringBean管理的方式很直观,但是较为麻烦我们在学习初期使用此种方式进行配置,在后期开发中建议使用注解的方式进行管理
-
代码实现:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--把需要Spring管理的对象进行配置--><bean id="admin" class="com.ffyc.springdemo.model.Admin" scope="singleton"><!--通过get,set方法注入--><property name="id" value="1"></property><property name="name" value="飞飞"></property><!--通过构造方法注入--><constructor-arg name="id" value="2"></constructor-arg><constructor-arg name="name" value="狗熊"></constructor-arg></bean></beans>
-
注:
-
我们在使用<property>标签进行配置时,类中必须要有get个set方法.因为<property>标签是通过类中的set方式创建对象的
-
在使用<constructor-arg>标签时,类中可以没有get,set 方法,但是必须要有构造方法.因为此方式是通过构造方法创建对象的
-
-
2.使用注解实现
在使用注解实现Bean管理之前,我们首先要进行配置,否则Spring无法帮我们找到对应的文件
Spring注解属性列表:
注解 | 说明 |
---|---|
@Component | 使用在类上,用于实例化Bean |
@Service | 使用在service层上,用于实例化Bean |
@Repository | 使用在dao层上,用于实例化Bean |
@Autowired | 使用在字段或setter上,用于根据类型依赖注入;使用在字段上就不需要再写setter |
@Qualifier | 结合@Autowired一起使用,用于根据名称进行依赖注入 |
@Resource | 相当于@Autowired+@Qualifier,按照名称进行依赖注入 |
@Value | 注入普通属性 |
@Scope | 标注Bean的作用范围 |
什么是依赖注入:
依赖注入,是IOC的一个方面,可以理解为不用我们自己创建对象,而是只需要描述它如何被创建,spring会帮我们创建,依赖外部的注入
使用注解前的配置:
1.导入注解所需的jar包: Spring的注解功能封装在aop包中,我们只需要导入Spring aop jar包即可,由于新版Spring jar包自动导入,此处我们无需再手动导入 2.在配置文件中开启扫描注解:
<!--开启Spring注解扫描--><context:component-scan base-package="com.ffyc.springdemo"></context:component-scan>
3.创建注解对象:
3.1 给实体类添加注解
@Component(value = "admin")@Scope(value = "singleton")public class Admin {}
3.2 dao层
package com.ffyc.springdemo.dao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.stereotype.Repository;@Repositorypublic class AdminDao {@AutowiredJdbcTemplate jdbcTemplate;public void saveAdmin(){System.out.println("保存管理员");}
3.3 service层
package com.ffyc.springdemo.service;import com.ffyc.springdemo.dao.AdminDao;import com.ffyc.springdemo.model.Admin;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class AdminService {@AutowiredAdminDao adminDao;public void saveAdmin(){adminDao.saveAdmin();}}
测试类:
package com.ffyc.springdemo.test;import com.ffyc.springdemo.service.AdminService;import org.junit.jupiter.api.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Test1 {@Testpublic void test() {ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");AdminService adminService = app.getBean("adminService", AdminService.class);adminService.saveAdmin();}}
操作结果:
我们可以看到使用注解的方式可以很轻松的替代原来需要在配置文件中进行的大量配置的功能.因此在后续的开发中我们也将使用注解的方式进行.但是使用注解也会有缺点,我们在下篇博客中进行分析.
四.SpringBean的生命周期
Spring中所说的bean对象,与我们new的对象是不同的,Spring中所说的bean对象是指Spring框架所创建管理的我们的对象.
从宏观上来说,bean对象的实现可以分为5个阶段:
-
实例化实例化 Instantiation 通过反射机制以及工厂创建出来的原始对象
-
属性赋值 Populate
-
初始化 Initialization 完成对初始对象的各种赋值,完成后就把bean对象放入容器中
-
将 bean 对象放入到容器中,使用
-
销毁 Destruction
五.Spring中的bean是线程安全的吗?
servlet对象是线程安全的吗?
不是,因为servlet对象只创建一个,多个请求访问的是同一个servlet对象,因此它不是线程安全的
Spring中的bean是否是线程安全的,需要看bean的作用于scope:
-
如果为Singleton表示是单例的,即不是线程安全的,会使用ThreadLocal为每个请求创建一个变量副本进行操作
-
如果为Prototype表示为原型额,是线程安全的,因为每到来一个请求就会为其创建一个bean.
bean又可以分为两种:
有状态bean和无状态bean
-
有状态bean就是有数据存储功能,例如包含成员变量
-
无状态bean就是没有数据存储功能,例如service层和dao层,只是方法调用.
相关文章:

SpringBean管理
一.什么是SpringBean? 在Spring中将管理对象称为 Bean.Bean是由一个SpringIOC容器实例化,组装和管理的对象.也就是说,Bean并不是由我们程序员编写的,而是在程序运行过程中,由Spring通过反射机制生成的. SpringBean是Spring框架在运行时管理的对象,我们编写的大多数逻辑代码都…...
关于Vue3中reactive的意义
在学习Vue3的时候产生疑问: const addForm reactive({ // 这里面的reactive啥意思sysPre: null,diaPre: null,tem: null })查询解决 在Vue3中,响应式对象是指通过reactive函数转换而来的对象,它的属性可以被Vue自动监测,当属性…...

平衡三进制
平衡三进制 一、定义 平衡三进制,也称为对称三进制。这是一个不太标准的 计数体系。 正规的三进制的数字都是由 0,1,2 构成的,而平衡三进制的数字是由 -1,0,1 构成的。它的基数也是 3(因为有三个可能的值)。由于将 -1 写成数字…...

python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据。正好之前学了python,练练手。 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了。 Unicode是一种编码方案,又称万国码…...

CSS的三大特性
🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…...

Linux-scheduler之负载均衡(二)
四、调度域 SDTL结构 linux内核使用SDTL结构体来组织CPU的层次关系 struct sched_domain_topology_level {sched_domain_mask_f mask; //函数指针,用于指定某个SDTL的cpumask位图sched_domain_flags_f sd_flags; //函数指针,用于指定某个SD…...

VScode第三方插件打开sqlite数据库
文章目录前言对比1.文本文件、表格软件打开2.专业软件3.pythonVScode 第三方库打开数据库1. 下载第三方库插件2.打开sqlite新建查询3.输入查询内容前言 最近在做的东西涉及SQLite数据库(一种常用在移动端的数据库类型,和mysql这些主流数据库也差不多&am…...
Kafka 监控
Kafka 监控主机监控JVM 监控集群监控监控 Kafka 客户端主机监控 主机监控 : 监控 Kafka 集群 Broker 所在的节点机器的性能 主机监控指标 : 机器负载 (Load) , CPU 使用率内存使用率 (空闲内存 , 已使用内存 (Used Memory) )磁盘 I/O 使用率 (读使用率/ 写使用率) , 网络 I/…...

MultipartFile与File的互转
MultipartFile与File的互转前言MultipartFile转File1.FileUtils.copyInputStreamToFile转换2.multipartFile.transferTo(tempFile);3. (推荐)FileUtils.writeByteArrayToFile(file, multipartFile.getBytes());File转MultipartFile前言 需求是上传Excel文件并读取E…...

数据结构与算法基础-学习-15-二叉树
一、二叉树定义二叉树是N(N>0)个节点的有限集,它可能是空集或者由一个根节点及两棵互不相交的分别称作这个根的左子树和右子树的二叉树组成。二、二叉树特点1、每个节点最多两个孩子。(也就是二叉树的度小于等于2)2…...

接口测试要测试什么?
一. 什么是接口测试?为什么要做接口测试? 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互…...

2023.03.12学习总结
项目部分写了内外菜单栏的伸缩,更新了导航栏,新增配置,scss变量 提交记录 学习了scss的使用和配置 ,设置了scss全局变量,组件样式 给element-plus配置了主题颜色,配置到了全局 http://t.csdn.cn/FhZYa …...

数据结构入门6-1(图)
目录 注 图的定义 图的基本术语 图的类型定义 图的存储结构 邻接矩阵 1. 邻接矩阵表示法 2. 使用邻接矩阵表示法创建无向网 3. 邻接矩阵表示法的优缺点 邻接表 1. 邻接表表示法 2. 通过邻接表表示法创建无向图 3. 邻接表表示法的优缺点 十字链表(有向…...

把C#代码上传到NuGet,大佬竟是我自己!!!
背景 刚发表完一篇博客总结自己写标准化C#代码的心历路程,立马就产生一个问题,就是我写好标准化代码后,一直存放磁盘的话,随着年月增加,代码越来越多,项目和版本的管理就会成为一个令我十分头疼的难题&…...

解决前端“\n”不换行问题
在日常开发过程中,换行显示是一种很常见的应用需求,但是偶然发现,有时候使用 "\n"并不会换行显示,只会被识别为空格,如下图。 通过上图可以看出,"\n"它被识别成了一个空格显示&#…...

Python打包成exe,文件太大问题解决办法(比保姆级还保姆级)
首先我要说一下,如果你不在乎大小,此篇直接别看了,因为我写过直接打包的,就多20M而已,这篇就别看了,点击查看不在乎大小直接打包这篇我觉得简单的令人发指 不废话,照葫芦画瓢就好 第1步&#…...
CSS弹性布局flex属性整理
1.align-items align-items属性:指定弹性布局内垂直方向的对齐方向。 常用属性: center 垂直居中展示 flex-start 头部对齐 flex-end 底部对齐 2. justify-content justify-content属性:属性(水平)对齐弹…...

14个你需要知道的实用CSS技巧
让我们学习一些实用的 CSS 技巧,以提升我们的工作效率。这些 CSS 技巧将帮助我们开发人员快速高效地构建项目。 现在,让我们开始吧。 1.CSS :in-range 和 :out-of-range 伪类 这些伪类用于在指定范围限制之内和之外设置输入样式。 (a) : 在范围内 如…...

【Flutter从入门到入坑之四】构建Flutter界面的基石——Widget
【Flutter从入门到入坑】Flutter 知识体系 【Flutter从入门到入坑之一】Flutter 介绍及安装使用 【Flutter从入门到入坑之二】Dart语言基础概述 【Flutter从入门到入坑之三】Flutter 是如何工作的 WidgetWidget 是什么呢?Widget 渲染过程WidgetElementRenderObjectR…...

中职网络空间安全windows渗透
目录 B-1:Windows操作系统渗透测试 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试,并将该操作显示结果中Telnet服务对应的端口号作为FLAG提交;编辑 2.通过本地PC中渗透测试平台Kali对服务器场景Wind…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

C# winform教程(二)----checkbox
一、作用 提供一个用户选择或者不选的状态,这是一个可以多选的控件。 二、属性 其实功能大差不差,除了特殊的几个外,与button基本相同,所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...