【Spring】Spring对IoC的实现
根据 【动力节点】最新Spring框架教程,全网首套Spring6教程,跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理, 文档密码:mg9b
Spring 相关文章整理汇总归纳于:https://www.yuque.com/u27599042/zuisie
IoC 控制反转
- 控制反转是一种思想。
- 控制反转是为了降低程序耦合度,提高程序扩展力,达到OCP原则,达到DIP原则。
- 控制反转,反转的是什么?
- 将对象的创建权利交出去,交给第三方容器负责。
- 将对象和对象之间关系的维护权交出去,交给第三方容器负责。
- 控制反转思想的实现:DI(Dependency Injection,依赖注入)
依赖注入
- 依赖注入实现了控制反转的思想。
- Spring通过依赖注入的方式来完成Bean管理的。
- Bean管理:Bean对象的创建,以及Bean对象中属性的赋值(或者叫做Bean对象之间关系的维护)。
- 依赖注入:
- 依赖指的是对象和对象之间的关联关系。
- 注入指的是一种数据传递行为,通过注入行为来让对象和对象产生关系。
- 依赖注入常见的实现方式包括两种:
- 第一种:set注入
- 第二种:构造注入
set 注入
- set注入,基于set方法实现的,底层会通过反射机制调用属性对应的set方法然后给属性赋值。
- 这种方式要求属性必须对外提供set方法。
set 注入的使用
public class UserDao {// 获取本类的日志记录器private static final Logger logger = LoggerFactory.getLogger(UserDao.class);public void insert(){// 使用一下log4j2日志框架logger.info("数据库正在保存用户信息。");}
}
public class VipDao {// 获取本类的日志记录器private static final Logger logger = LoggerFactory.getLogger(VipDao.class);public void insert(){logger.info("正在保存Vip信息!!!!");}
}
public class UserService {private UserDao userDao;private VipDao vipDao;public void setAbc(VipDao vipDao){this.vipDao = vipDao;}// set注入,必须提供一个set方法。// Spring容器会调用这个set方法,来给userDao属性赋值。// 我自己写一个set方法,不使用IDEA工具生成的。不符合javabean规范。// 至少这个方法是以set单词开始的。前三个字母不能随便写,必须是“set"/*public void setMySQLUserDao(UserDao xyz){this.userDao = xyz;}*/// 这个set方法是IDEA工具生成的,符合javabean规范。public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void saveUser(){// 保存用户信息到数据库userDao.insert();vipDao.insert();}
}
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--配置dao--><bean id="userDaoBean" class="com.powernode.spring6.dao.UserDao"/><!--配置service--><bean id="userServiceBean" class="com.powernode.spring6.service.UserService"><!-- 想让Spring调用对应的set方法,需要配置property标签 --><!-- name属性值:set方法的方法名,去掉set,然后把剩下的单词首字母变小写。--><!-- ref翻译为引用,英语单词:referencesref,其属性值指定的是要注入的bean的id。--><!--<property name="mySQLUserDao" ref="userDaoBean"/>--><!--set方法起名的时候,不要为难自己,按照规范来。所以一般情况下name位置写属性名就行了。--><property name="userDao" ref="userDaoBean"/><!--<property name="vipDao" ref="vipDaoBean"/>--><!-- name属性值:set方法的方法名,去掉set,然后把剩下的单词首字母变小写。 --><property name="abc" ref="vipDaoBean"/></bean><bean id="vipDaoBean" class="com.powernode.spring6.dao.VipDao"/></beans>
set 注入分析
- set 注入的实现原理:
- 通过property标签获取到属性名:userDao
- 通过属性名推断出与该属性对应的set方法的方法名:setUserDao
- 通过反射机制调用setUserDao()方法给属性赋值
- 一般情况下,set方法的命名符合JavaBean规范,property标签的name属性的属性值就是属性名。
- property标签的name属性的属性值是,setUserDao()方法名演变得到的,演变的规律是:
- 去掉set,然后剩下的部分首字母改为小写
- setUsername() 演变为 username
- setPassword() 演变为 password
- setUserDao() 演变为 userDao
- setUserService() 演变为 userService
- property标签的ref属性的属性值是要注入的bean对象的id,通过ref属性来完成bean的装配,这是bean最简单的一种装配方式。
- 装配指的是:创建系统组件之间关联的动作
- 对于property标签来说,ref属性也可以采用标签的方式,不使用ref属性:
<bean id="userServiceBean" class="com.powernode.spring6.service.UserService"><property name="userDao"><ref bean="userDaoBean"/></property>
</bean>
- 总结:set注入的核心实现原理:通过反射机制调用set方法来给属性赋值,让两个对象之间产生关系。
构造注入
- 核心原理:通过调用构造方法来给属性赋值。
- 与set注入相比,构造注入是在创建对象的同时进行注入,进行属性的赋值,而set注入是在对象创建之后。
public class CustomerService {private UserDao userDao;private VipDao vipDao;public CustomerService(UserDao userDao, VipDao vipDao) {this.userDao = userDao;this.vipDao = vipDao;}public void save(){userDao.insert();vipDao.insert();}}
<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="xxxx" class="com.powernode.spring6.dao.UserDao"/><bean id="yyyy" class="com.powernode.spring6.dao.VipDao"/><bean id="csBean3" class="com.powernode.spring6.service.CustomerService"><!--不指定下标,也不指定参数名,让spring自己做类型匹配。--><!--这种方式实际上是根据类型进行注入的。spring会自动根据类型来判断把ref注入给相应的参数。--><constructor-arg ref="yyyy"/><constructor-arg ref="xxxx"/></bean><bean id="csBean2" class="com.powernode.spring6.service.CustomerService"><!--根据构造方法参数的名字进行注入。--><!-- name属性值为要进行注入的构造函数的参数 --><constructor-arg name="vipDao" ref="yyyy"/><constructor-arg name="userDao" ref="xxxx"/></bean><bean id="csBean" class="com.powernode.spring6.service.CustomerService"><!--构造注入--><!--index属性指定参数下标,第一个参数是0,第二个参数是1,第三个参数是2,以此类推。ref属性用来指定注入的bean的id--><!--指定构造方法的第一个参数,下标是0--><constructor-arg index="0" ref="xxxx"/><!--指定构造方法的第二个参数,下标是1--><constructor-arg index="1" ref="yyyy"/></bean></beans>
- 通过构造方法进行注入有三种形式:
- 可以通过下标
- 可以通过参数名
- 也可以不指定下标和参数名,可以类型自动推断。
- Spring在装配方面还是比较健壮的
相关文章:
【Spring】Spring对IoC的实现
根据 【动力节点】最新Spring框架教程,全网首套Spring6教程,跟老杜从零学spring入门到高级 以及老杜的原版笔记 https://www.yuque.com/docs/share/866abad4-7106-45e7-afcd-245a733b073f?# 《Spring6》 进行整理, 文档密码:mg9b…...
正则表达式中的大括号-花括号{}有什么用?
在正则表达式中,花括号 {} 是用于指定匹配次数的量词元字符。它可以用来表示匹配的次数范围或精确匹配次数。 具体来说,花括号 {m} 表示前面的模式匹配恰好出现 m 次,而 {m, n} 表示前面的模式匹配出现 m 到 n 次。 以下是一些常见的用法示…...
Flutter 状态栏完美攻略
1. 沉浸式状态栏 Scaffold(extendBodyBehindAppBar: true,appBar: AppBar(toolbarHeight: 0,),body: Container(color:Colors.red) ) 2. 状态栏的背景颜色 Scaffold(appBar: AppBar(backgroundColor: Colors.transparent,),body: Container(color:Colors.red) ) 3. 状态栏的…...
Packet Tracer - 连接有线和无线 LAN
Packet Tracer - 连接有线和无线 LAN 地址分配表 设备 接口 IP 地址 连接到 云 Eth6 N/A Fa0/0 Coax7 N/A Port0 电缆调制解调器 Port0 N/A Coax7 Port1 N/A 互联网 Router0 控制台端口 N/A RS232 Fa0/0 192.168.2.1/24 Eth6 Fa0/1 10.0.0.1/24 Fa…...
02 笔记本电脑m.2硬盘更换
1 工具展示 SN570的2T硬盘。够用了。 对于这台华为,使用的螺丝刀批头是4或5毫米的六边形批头。如果出现打滑的情况,请不要用蛮力哦。 2 更换过程 使用螺丝刀拧走后盖的螺丝(为了避免会出问题要再次打开,我到现在还没有把螺丝拧回…...
2.04 商品搜索功能实现
根据关键字获取分类查询对应的分页商品信息,并可以价格和销量进行排序切换 步骤1:mapper.xml编写sql语句 <!-- k: 默认,代表默认排序,根据name--> <!-- c: 根据销量排序--> <!-- p: 根据价格排序--> <sel…...
【SEO基础】百度权重是什么意思及网站关键词应该怎么选?
百度权重是什么意思及网站关键词应该怎么选? 正文共:3253字 20图 预计阅读时间:9分钟 1.什么是网站权重? 这段时间和一些朋友聊到网站权重以及关键词,发现蛮多人对于这两个概念的认知还是存在一些错误的…...
Unity实现在3D模型标记
Canvas 模式是UI与3D混合模式(Render modelScreen space-Camera) 实现在3D模型标记,旋转跟随是UI不在3D物体下 代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public clas…...
iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动
iOS开发-NotificationServiceExtension实现实时音视频呼叫通知响铃与震动 在之前的开发中,遇到了实时音视频呼叫通知,当App未打开或者App在后台时候,需要通知到用户,用户点击通知栏后是否接入实时音视频的视频或者音频通话。 在…...
性能调试【学习笔记】
什么是调优? 每执行一个Java命令,就分配一个JVM,调优时不要混淆。 根据需求进行JVM规划和预调优优化运行JVM的运行环境(慢、卡顿)解决JVM运行过程中出现的各种问题(内存泄露、内存溢出OOM) 生…...
【taro react】---- 获取元素的位置和宽高等信息
1. 需求分析 添加节点的布局位置的查询请求。相对于显示区域,以像素为单位。其功能类似于 DOM 的 getBoundingClientRect。返回 NodesRef 对应的 SelectorQuery。区分小程序和H5的环境,调用 getBoundingClientRect 获取对应的信息。 2. H5 实现 判断传…...
Java【Spring】项目创建、存储和获取 Bean 的基本方式
文章目录 前言一、创建 Spring 项目1, 创建 Maven 项目2, 添加 Spring 依赖3, 创建启动类 二、存储 Bean 的基本方式1, 创建 Bean2, 存储 Bean 三、获取 Bean 的基本方式1, 获取上下文对象2, 获取 Bean3, 使用 Bean 总结 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的…...
docker minio安装
1.介绍 Minio是一款开源的对象存储服务,它可以在任何硬件或云平台上提供高性能、高可用性和高安全性的存储解决方案。Minio最新版是2021年11月发布的RELEASE.2021-11-24T23-19-33Z,它带来了以下几个方面的改进和新特性: - 支持S3 Select AP…...
设计模式-命令模式在Java中的使用示例-桌面程序自定义功能键
场景 欲开发一个桌面版应用程序,该应用程序为用户提供了一系列自定义功能键,用户可以通过这些功能键来实现一些快捷操作。 用户可以将功能键和相应功能绑定在一起,还可以根据需要来修改功能键的设置,而且系统在未来可能还会增加…...
分冶算法 剑指 07 重建二叉树 排序算法:剑指45 把数组排成最小的数 10-I 斐波那契数列
来记录几个注意事项 1.vector容器里利用find()函数 不同于map(map有find方法),vector本身是没有find这一方法,其find是依靠algorithm来实现的。 所以要包含头文件 #include <iostream> #include <…...
Postgresql取消正在执行的任务或强制终止正在执行的任务
Postgresql取消正在执行的任务或强制终止正在执行的任务 要停止 PostgreSQL 数据库中当前正在执行的所有任务,可以使用以下方法: 使用 pg_cancel_backend 函数:连接到 PostgreSQL 数据库,并执行以下命令以停止所有正在执行的任务…...
【Linux】Centos7 的 Systemctl 与 创建系统服务 (shell脚本)
Systemctl systemctl 命令 # 启动 systemctl start NAME.service # 停止 systemctl stop NAME.service # 重启 systemctl restart NAME.service # 查看状态 systemctl status NAME.service # 查看所有激活系统服务 systemctl list-units -t service # 查看所有系统服务 syste…...
Redis集群Cluster搭建
Redis集群Cluster搭建 集群框架1、下载redis2.创建Cluster文件3.修改redis配置文件4.启动redis5.链接各个redis6.分配槽位7.添加从机节点(备份Redis)8.以集群方式登录9.使用开源Redis可视化客户端链接 集群框架 三个集群节点,每个节点有个副本…...
swing组件应用
1. 组件概述 (1) 说明 组件组成Java 的图形界面的各个元素,按照不同的功能,可分为 顶层容器、中间容器、基本组件。顶层容器为java.awt.Window的子类,有JFrame、JDialog等。中间容器和基础组件都为javax.swing.JCompo…...
Spring学习记录----十五、面向切面编程AOP+十六、Spring对事务的支持
十五、面向切面编程AOP IoC使软件组件松耦合。AOP让你能够捕捉系统中经常使用的功能,把它转化成组件。 AOP(Aspect Oriented Programming):面向切面编程,面向方面编程。(AOP是一种编程技术) …...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
