当前位置: 首页 > news >正文

【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也可以成功(底层走的是反射)

在这里插入图片描述
当手写了有参,无参被覆盖后,再执行程序:

error
在这种创建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…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...