【SSM】篇一:初试Spring--Ioc与Bean

文章目录
- 1、Spring
- 2、SpringFramework系统架构
- 3、Bean
- Bean的配置
- Bean的实例化
- Bean的生命周期
- 4、依赖注入DI
- setter注入和构造器注入
- 依赖自动装配
- 5、集合注入
1、Spring
Spring地址:https://spring.io

Spring技术的优点:


Spring家族(Spring全家桶):

2、SpringFramework系统架构
Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基。
Spring Framework系统架构图如下:

核心概念
代码书写现状–耦合度偏高

基于上面的问题,我们考虑使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象

Ioc(Inversion of Control)即,控制反转,这种思想核心在于把对象的创建控制权由程序转移到外部,以达到解耦的目的。
- Spring技术对Ioc思想进行了实现—提供一个
Ioc容器,来充当Ioc思想中的"外部" - Ioc容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中统称
Bean - 在容器中建立bean与bean之间的依赖关系的整个过程,称为
依赖注入(DI,Dependency Injection)

小结:

Ioc入门案例
源码结构如下:

使用之前耦合度较高的方式,则:

使用Ioc思想之后,先准备一个配置文件applicationContext.xml:

(新建没有Spring Config选项的,先导入Spring坐标,看下图:)

接下来新建App2.java文件,使用Ioc思想:
- 获取Ioc容器
- 获取bean

DI入门案例
做完上面的Ioc,还遗留两个问题:

- 删除业务层中使用new对象创建的dao对象,提供set方法给容器调用,用来传对象

- 在配置文件中配置两个bean之间的关系,Service中注入dao

3、Bean
Bean的配置
Bean的基础配置

属性中,除了id,也可用name属性来标识,name是在起别名。多个别名之间用逗号封号空格都行。getBean方法中除了传入id,传入别名name也可,ref属性中也可以用name代替id

注意,当getBean传入的id或者name不存在,出现异常:

两次获取bookService对象:

根据输出结果可以看到这是同一个对象:

由此,使用scope属性来控制创建出来的实例是一个还是多个:

关于bean默认是单例的一些思考:如果这个对象是每次会记录一些成员变量的属性值,即不能复用,那这种对象就不适合交给容器进行管理。

Bean的实例化
Bean的本质就是对象,创建bean是使用构造方法完成的
Bean的实例化--构造方法
Spring创建对象的时候默认使用对应类的无参构造,而且构造方法是private也可以成功(底层走的是反射)

当手写了有参,无参被覆盖后,再执行程序:

在这种创建bean的方法中,如果无参构造不存在,则有BeanCreationException异常
Bean的实例化--静态工厂
相比于之前的使用构造方法,静态工厂即某个工厂类中写一个get方法,来return一个需要的对象。一般为了兼容早期的遗留系统使用。

Bean的实例化--实例工厂与FactoryBean
和之前的静态方法不同的是,实例工厂即通过工厂类的实例方法来造对象。



如此,有两个缺陷,一是工厂对象的创建,而是创建所需对象

由此有了另一种思路:

此时的配置文件就只需:

Bean的生命周期
- 初始化容器
- 创建对象(new,分一块内存)
- 执行构造方法
- 执行属性注入(set方法)
- 执行bean的初始化方法
- 使用bean
- 执行业务操作
- 关闭或销毁容器
- 执行bean的销毁方法
使用自己定义的方法对bean的生命周期进行控制:

也可以直接实现这两个接口,然后重写方法来完成,这样就不用在xml文件中加配置了:

注意到:初始化bean的时机是在set完属性之后,而销毁bean的时机是容器关闭前触发bean的销毁而容器关闭的方式有两种:
- 使用ConfigurableApplicationContext接口的close方法
- 注册关闭钩子,这样程序运行完退出JVM前会先关闭容器再退出虚拟机

4、依赖注入DI
setter注入和构造器注入
依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,可以使用set方法或者构造方法来完成:

使用setter注入引用类型
-
在bean中定义引用类型的属性,并提供相应的set方法

-
在xml配置中使用property标签的ref属性来注入引用类型的对象,name后是属性名,ref后是参照对象的id

需要注入多个引用类型属性的时候,再加property标签就行

使用setter注入简单数据类型
- 提供对应属性的set方法
- 还是使用property标签,不同的是不再用引用类型专属的ref,而是value


构造器注入
- 定义引用类型属性并提供构造方法

- xml配置中使用constructor-arg标签,name属性是构造方法中的形参名,不再是属性名。ref属性和之前一样。name是形参名,这样耦合度很高,可以用type属性(即按形参类型区分注入)或者index属性(按照形参位置注入)

- 对于普通类型,也是提供构造方法,使用constructor-arg标签

依赖自动装配
Ioc容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程,有以下几种方式:
- 按类型
- 按名称
- 按构造方法
- 不启用自动装配
配置中使用bean标签autowrite属性设置自动装配的类型:

举例:

自动装配的注意点:

5、集合注入
相关文章:
【SSM】篇一:初试Spring--Ioc与Bean
文章目录1、Spring2、SpringFramework系统架构3、BeanBean的配置Bean的实例化Bean的生命周期4、依赖注入DIsetter注入和构造器注入依赖自动装配5、集合注入1、Spring Spring地址:https://spring.io Spring技术的优点: Spring家族(Spring全家…...
华为OD机试真题Python实现【出租车计费】真题+解题思路+代码(20222023)
🔥系列专栏 华为OD机试(Python)真题目录汇总华为OD机试(JAVA)真题目录汇总华为OD机试(C++)真题目录汇总华为OD机试(JavaScript)真题目录汇总文章目录 🔥系列专栏题目输入输出示例一输入输出说明示例二输入输出说明...
Elasticsearch:如何修改 nested 字段的值
Nested 类型是 object 数据类型的特殊版本,它允许对象数组以一种可以彼此独立查询的方式进行索引。在内部,嵌套对象将数组中的每个对象索引为单独的隐藏文档,这意味着每个嵌套对象都可以使用 nested query 独立于其他对象进行查询。每个 nest…...
【JAVA】jdk8 Stream 排序精通
背景 jdk8的stream流能方便的排序,但是每次都要查资料,非常不方便,不确定,所以这次直接弄懂,不再迷茫。 转载请注明来源,创作不易,请多多支持。 基础排序 stream流 大家应该都比较熟悉了&…...
python的opencv操作记录12——Canny算子使用
文章目录Canny算子非极大值抑制非极大值抑制中的插值滞后阈值实际应用直接使用Canny算子使用膨胀先阈值分割Canny算子 上一篇说到,我在一个小项目里需要在一幅图像中提取一根试管里的两种液体的截面。为了达到这个目的使用传统图像里的区域分割技术,实际…...
Spark on hive Hive on spark
文章目录Spark on hive & Hive on sparkHive 架构与基本原理Spark on hiveHive on sparkSpark on hive & Hive on spark Hive 架构与基本原理 Hive 的核心部件主要是 User Interface(1)和 Driver(3)。而不论是元数据库&a…...
【MySQL】子查询
这里写自定义目录标题子查询1、子查询的基本使用2、 单行子查询2.1、单行比较查询2.2、HAVING 中的子查询2.3、CASE中的子查询3、多行子查询4、相关子查询5、EXISTS 与 NOT EXISTS关键字子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQ…...
Day889.MySQL高可用 -MySQL实战
MySQL高可用 Hi,我是阿昌,今天学习记录的是关于MySQL高可用的内容。 正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。但是…...
剑指 Offer 24. 反转链表
⭐简单说两句⭐ CSDN个人主页:后端小知识 🔎GZH:后端小知识 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 题目: 剑指 Offer 24. 反转链表 ,我们今天还是来看一道easy的题目吧&…...
“黑铁时代”,地产人如何以客户视角加速房企数字化转型
本文从行业洞察、业务设计、数据建设以及实践探索四个部分详细阐述地产行业数字化的实践、思考和理解。点击文末“阅读原文”,观看完整版直播回放并下载演讲文档。一、洞察:房企经营思路的变化企业的转型都是围绕着业务经营变化进行的,房企数…...
零入门kubernetes网络实战-14->基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信测试案例
《零入门kubernetes网络实战》视频专栏地址 https://www.ixigua.com/7193641905282875942 本篇文章视频地址(稍后上传) 本篇文章继续提供测试案例: 基于veth pair、namespace以及路由技术,实现跨主机命名空间之间的通信 1、网络拓扑如下 2、网络拓扑构建…...
【pytorch框架】对模型知识的基本了解
文章目录TensorBoard的使用1、TensorBoard启动:2、使用TensorBoard查看一张图片3、transforms的使用pytorch框架基础知识1 nn.module的使用2 nn.conv2d的使用3、池化(MaxPool2d)4 非线性激活5 线性层6 Sequential的使用7 损失函数与反向传播8 优化器9 对现有网络的使…...
SUP桨板电动气泵方案——鼎盛合方案
SUP桨板是现时最热门的水上运动之一,它的全称是Stand Up Paddle,简称SUP。这项运动近几年在我国三亚等地区风靡一时,在网上经常看到一些运动博主或者明星网红晒出冲浪视频,刺激又惊险。SUP桨板为充气式桨板,需要通过充…...
小白系列Vite-Vue3-TypeScript:011-登录界面搭建及动态路由配置
前面几篇文章我们介绍的都是ViteVue3TypeScript项目中环境相关的配置,接下来我们开始进入系统搭建部分。本篇我们来介绍登录界面搭建及动态路由配置,大家一起撸起来......搭建登录界面登陆接口api项目登陆接口是通过mockjs前端来模拟的模拟服务接口Login…...
C语言( 缓冲区和重定向)
一.缓冲输入,无缓存输入 while((chgetchar()) ! #) putchar(ch); 这里getchar(),putchar()每次只处理一个字符(这里只是知道就好了),而我们使用while循环,当读到#字符时停止 而看到输出例子,第一行我们输入…...
编程思想、方法论和架构的类型及应用
概要编程思想是指在编写代码时所采用的基本思维方式和方法论。分类编程思想编程思想为软件开发提供了思维范式和指导思路,例如面向对象思想、函数式编程思想等,它们帮助程序员更好地抽象问题、组织代码、提高代码复用性和可维护性,包括一下几…...
【OA办公】OA流程审批大揭秘,带你看遍所有基础流程
流程审批,是所有企业的OA办公系统重要组成部分,是任何OA办公系统都不可缺少的。比起传统的纸张传阅、签批的审批模式浪费了大量的时间和成本,因此越来越多的企业采用OA这种全新的、高效的、智能的审批模式。流程审批除了这些好处,…...
《零基础入门数据结构与算法》专栏介绍
目录 前言 第一部分:重点 第二部分:题库 第三部分:测试 第四部分:实验 第五部分:试卷 总结 前言 本专栏主要分为五个部分: ① 重要知识点详解 ② 近百道练习题解析 ③ 数据结构与算法章节测试 …...
测试开发之Django实战示例 第九章 扩展商店功能
第九章 扩展商店功能在上一章里,为电商站点集成了支付功能,然后可以生成PDF发票发送给用户。在本章,我们将为商店添加优惠码功能。此外,还会学习国际化和本地化的设置和建立一个推荐商品的系统。本章涵盖如下要点:建立…...
【Spring】一文带你吃透AOP面向切面编程技术(下篇)
个人主页: 几分醉意的CSDN博客_传送门 上节我们介绍了什么是AOP、Aspectj框架的前置通知Before传送门,这篇文章将继续详解Aspectj框架的其它注解。 文章目录💖Aspectj框架介绍✨JoinPoint通知方法的参数✨后置通知AfterReturning✨环绕通知Ar…...
openclaw喂饭教程!在 Linux 环境下快速完成安装、初始化与 Web UI 配置
基础示例:单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤: 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...
AI系统架构评审中的可扩展性设计:3个关键策略
AI系统架构评审中的可扩展性设计:3个关键策略 摘要 在AI技术飞速发展的今天,系统可扩展性已成为决定AI项目成败的关键因素之一。本文深入探讨了AI系统架构评审中可扩展性设计的三个核心策略:分布式计算与存储架构、模型解耦与服务化设计以及自适应资源调度与弹性扩展。通过…...
如何用pose-search在5分钟内构建智能人体姿态分析系统
如何用pose-search在5分钟内构建智能人体姿态分析系统 【免费下载链接】pose-search x6ud.github.io/pose-search 项目地址: https://gitcode.com/gh_mirrors/po/pose-search 你是否曾经想过为你的应用添加实时人体姿态识别功能,但又担心技术门槛太高&#x…...
株洲品牌设计公司哪家更专业?
在株洲,无论是传统制造业寻求转型升级,还是新兴消费品牌意图破圈,一个专业、系统、能驱动增长的品牌设计,已成为企业赢得市场竞争的关键。然而,面对市场上众多的设计公司,许多企业主都会感到困惑࿱…...
从CVE-2023-3450看锐捷RG-BCR860路由器:一次网络诊断功能引发的命令注入实战剖析
1. 漏洞背景与设备介绍 锐捷RG-BCR860是面向中小型商业场景设计的云路由器,主打简单易用的中文Web管理界面。这款设备常见于连锁餐饮、快捷酒店等需要稳定网络环境的场所,最大支持150台终端同时接入。作为一款商用设备,它内置了安全审计模块和…...
避开SDR通信的‘坑’:我在用Pluto做16QAM传输时遇到的相位偏移和同步问题
避开SDR通信的‘坑’:我在用Pluto做16QAM传输时遇到的相位偏移和同步问题 第一次用Pluto SDR搭建16QAM通信链路时,我盯着屏幕上扭曲的星座图发呆了半小时——理论上完美的16个星点,在实际接收时却像被无形的手揉成了一团毛线。这种挫败感想必…...
从视频处理到医疗影像:Conv3D输出形状计算中的那些‘坑’与高效设计指南
从视频处理到医疗影像:Conv3D输出形状计算中的那些‘坑’与高效设计指南 当你在深夜调试一个3D卷积神经网络时,突然发现输出的特征图尺寸比预期小了整整一半——这种场景对于处理视频分类或医疗影像的工程师来说再熟悉不过了。Conv3D层看似简单的参数设…...
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染
Z-Image-Turbo-辉夜巫女材质与光影专题:金属、玻璃、织物等不同质感的极致渲染 你有没有想过,为什么有些AI生成的图片看起来“假假的”,一眼就能认出来?很多时候,问题就出在“质感”上。金属不像金属,玻璃…...
Qwen2.5-7B+Tools应用场景解析:智能客服、信息查询等实战案例
Qwen2.5-7BTools应用场景解析:智能客服、信息查询等实战案例 1. 引言:当大语言模型遇上工具 想象一下,你正在运营一家电商平台,每天要处理上千条客户咨询。人工客服团队疲于应对,而客户等待时间越来越长。这时&#…...
李慕婉-仙逆-造相Z-Turbo一键部署教程:基于Ubuntu20.04的快速环境搭建
李慕婉-仙逆-造相Z-Turbo一键部署教程:基于Ubuntu20.04的快速环境搭建 1. 开篇:为什么选择这个方案? 如果你对AI绘画感兴趣,特别是想自己动手部署一个功能强大的开源模型来玩玩,那今天这个教程就是为你准备的。李慕婉…...
