Spring-Framework-ioc-4

news/2024/5/5 13:51:17/文章来源:https://blog.csdn.net/uesowys/article/details/127326879

1前言

2基本原理

3IOC容器

4Bean

5依赖

5.1依赖注入

5.2自动装配

自动装配,是一种自动化地进行依赖注入的机制,IOC容器使用此机制实现bean之间依赖关系的自动绑定,该机制具有如下的优点:

  • 不需要显式地指定依赖的属性域、构造函数参数

  • 在开发过程中,直接在代码中指定依赖bean,无需要修改bean对应的配置元数据,IOC容器自动地绑定bean之间的依赖关系

在XML类型的配置元数据中,自动装配的模式对应标签bean的属性autowire,其支持的模式如下所示:

no 模式

不使用自动装配的依赖注入模式,开发者需要在配置元数据中指定bean的依赖关系,不建议经常变化依赖注入的模式

byName 模式

根据依赖项的名称自动装配,例如,Bean中存在依赖项abc,IOC容器使用setter方法的方式自动地执行setAbc方法注入名称是abc的依赖bean

byType 模式

根据依赖项的类型自动装配,在IOC容器中使用类型注入的模式的时候,被注入的类型的实现必须保持唯一,否则IOC容器会出现异常,因为,IOC容器无法决定注入何种类型的实现(同一个抽象类型的多种实现)

constructor 模式

使用构造函数自动装配,在IOC容器中使用构造函数注入的模式的时候,被注入的类型的实现必须保持唯一,否则IOC容器会出现异常,因为,IOC容器无法决定注入何种类型的实现(同一个抽象类型的多种实现)

byType类型、constructor类型支持集合的依赖注入,IOC容器会根据类型判断自动注入对应的bean到指定的集合中。

自动装配的限制与缺点

通常在同一个工程项目中只使用同一种依赖注入的模式,否则很容易出现混淆,不利于维护代码的可读性,自动装配的依赖注入模式既有优点也有缺点,其限制与缺点如下所示:

  • 显式地在配置元数据中指定依赖项的优先级,高于以自动装配的方式指定依赖项的优先级,自动装配不支持基本类型、字符串的依赖注入

  • 自动装配的依赖注入模式,因为没有显式地指定依赖项,IOC容器在类型冲突的情况下无法确定具体的依赖项而出现异常

  • 不利于生成bean配置元数据的维护文档

IOC容器也提供配置元数据属性的方式支持一些特殊的使用场景,如下所示:

  • 标签bean中设置属性autowire-candidate的值等于false,指定的bean不支持自动装配

  • 标签bean中设置属性primary的值等于true,在同一个抽象类型多种实现的情况下,确定依赖的bean

自动装配的依赖注入模式支持Java代码注解的方式是:@Autowired。

5.3方法注入

一般情况下,IOC容器的bean实例对象都是单例的,这些对象在IOC容器中只被创建一次,在IOC容器的生命周期内,所有业务逻辑的处理都使用单例对象。假设存在单例对象A、单例对象B,而且A依赖B,A使用B的方法m0,如果新的业务逻辑是单例对象A每次业务逻辑处理都需要使用非单例对象B的方法m0,则旧的依赖注入方式不再适用于新的业务逻辑。因此,IOC容器提供方法级别(函数级别)的依赖注入、创建新bean的方式支持以上的新的业务场景。

类CommandManager是一个命令管理器,使用命令设计模式,该模式是一种代理执行的模式,由调用者提供执行的命令、命令行参数,管理器负责执行对应的命令、返回命令执行结果、记录命令执行日志或者其他维护功能

以上定义的类CommandManager只是使用Spring-Framework提供的功能支持创建全新的bean实例对象(方法createCommand),未使用配置元数据的方式,使用IOC容器创建一个新的名称是command、类型是Command.class的bean实例对象

查找方法注入

IOC容器提供方法级别的依赖注入,例如,假设存在名称是A、B的Bean,IOC容器支持使用B的方法替换A的方法,也就是,当A调用某个方法的时候,实际上是调用B的方法。该方法的实现是使用CGLIB的动态代理技术,由于Java只支持接口的代理而不支持实现类的代理,因此,CGLIB需要动态地生成字节码覆盖已存在的方法或者生成新的覆盖方法,从实现Bean的方法替换。

类CommandManager是抽象类,执行命令的时候每次都是创建新的命令(类同于每次都需要创建一个新的非单例bean,其对应原型bean),则IOC容器使用CGLIB技术生成字节码覆盖createCommand方法,并且在覆盖方法中返回新的、名称是myCommand的非单例bean

使用Java注解Lookup绑定新创建的bean,指定具体bean的名称、根据返回类型两种绑定方式

任意方法替换

IOC容器支持可替换任何方法的依赖注入。

类MethodReplacer是一个替换任何方法的执行器接口,其方法reimplement的参数包括传入被替换的对象、被执行的方法、被执行方法的参数

替换类MyValueCalculator的方法computeValue,使用执行器的方法reimplement执行

(未完待续)

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于STC89C52单片机的蔬菜大棚实时温度测量控制系统

目录 摘要 …………………………………………………………………………………I ABSTRACT II 第一章 设计任务及方案分析 1 1.1 设计任务及要求 1 1.2 设计总体方案及方案论证 1 1.3 温度测量的方案与分析 1 1.31芯片选择 1 1.32实现方法简介 2 1.33 方案设计 2 第二章 芯片简介…

Java基础(二):集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举

Java基础(一):编译和解释、数据类型、变量作用域、String常用方法、数组、面向对象、异常 Java基础(二):集合、IO流(Zip压缩输入/输出流等)、File文件类、反射、枚举 Java异常、继承结构、处理异常、自定义异常、SpringBoot中全…

数据库学习记录2

数据库学习记录1介绍了DDL (Data Definition Language) 数据定义语言。 在数据库学习记录2中,我们介绍常见的数据类型; 主要分为三类:数值类型、字符串类型、日期时间类型。 数值类型 类型大小有符号范围无符号范围描述TINYINT1byte(-128&…

生成模型笔记(七):自回归模型

有鸟止南方之阜,三年不翅,不飞不鸣,嘿然无声,此为何名? 第七部分 深度自回归模型(Deep Autoregressive Model, DARM) 参考内容 https://jmtomczak.github.io/blog/2/2_ARM.html A…

第二十三:Fiddler抓包教程(23)-Fiddler如何优雅地在正式和测试环境之间来回切换-上篇

一.简介 1.在开发或者测试的过程中,由于项目环境比较多,往往需要来来回回地反复切换,那么如何优雅地切换呢? 二.实际工作场景 1.问题场景 1.1.已发布线上APP出现接口错误,如何测试线上APP访问本地请求?…

QFramework v1.0 使用指南 介绍篇:01. 简介

01. 简介 大家好,我是 QFramework 的作者 凉鞋,QFramework 从第一次代码提交到现在快 7 年了(2015 年 12 月 ~ 2022 年 10 月)了,而经过了 7 年时间的打磨,我们终于迎来了 v1.0 版本。 此教程&#xff0c…

Macos/linux g++ 安装OpenCV环境

本文前半部分主要翻译官方文档的东西 https://docs.opencv.org/4.x/d0/db2/tutorial_macos_install.html 依赖: CMake 3.9 or higher Git Python 2.7 or later and Numpy 1.5 or later大家都是程序员自己安装一下吧 在 relese 这里下载一下源代码: htt…

第三章:为组件库添加规范【前端工程化入门-----从零实现一个react+ts+vite+tailwindcss组件库】

第三章:为组件库添加规范 本章我们会用 eslint、prettier以及Husky 为组件库添加规范; 前置知识: eslint、prettier和husky各有什么作用? eslint是代码检查工具,你可以配置eslint,然后通过lint命令检测…

打游戏哪款蓝牙耳机好?四款适合打游戏的蓝牙耳机推荐

现在年轻人最离不开的就是手游,蓝牙耳机可谓是手机游戏的最佳搭档,一副好的蓝牙耳机可以为游戏带来很完美的助力,延迟低的蓝牙耳机可以实现更好的游戏体验感,那么接下来推荐四款适合打游戏的蓝牙耳机。 1、南卡小音舱蓝牙耳机 佩…

2022年全国大学生数学建模美赛E题NPP数据获取

今年的数学建模美赛终于开始了!令我感到欣喜的是,今年E题竟然和地理遥感专业息息相关。E题是分析生态环境方面的!因此,有很多小伙伴来询问咨询如何解决这道题目。有些小伙伴,还咨询如何使用CASA软件来计算NPP数据&…

Flink SQL使用Catalog消费Kafka时,多个Source读取同一主题解决方案

一、Catalog定义 Catalog 提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。数据处理最关键的方面之一是管理元数据。 元数据可以是临时的,例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是…

apollo在虚拟机下部署遇到的坑

目录问题描述解决方法编译问题总结问题描述 ​   其实在虚拟机下部署apollo网上是有线程教程的。可以参考在虚拟机上安装运行百度Apollo 6.0,Apollo 6.0 安装完全指南。我依靠这两个指南准备部署的是apollo 7.0,事实证明虽然版本不同,但部…

1、6边距复合属性

提示:文章写完后,padding可以有到四个值。 1、语法: div{ padding:“50px”; padding:“5px 10px”; padding:“5px 10px 20px”; padding:“5…

flex竖排列元素排列方向

flex竖排列元素排列方向一、flex-direction: (元素排列方向) ※ flex-direction:row (横向从左到右排列==左对齐)※ flex-direction:row-reverse (与row 相反)※ flex-direction:column (从上往下排列==顶对齐)※ flex-direction:column-reverse (与column 相反) 二…

基于导频的信道估计实现

目录 零、前言 一、为什么要信道估计 二、导频的概念 (1)为什么要有导频 (2)导频在信道估计中作用 (3)关于导频序列的补充 三、最小二乘法估计 (1)LS信道估计算法分析 &…

24.登录form的显示

1.概括 本次博客的代码就不自己去写输入框了,直接去引用element官网中的就好。 具体如何实现可以去订阅Vue专栏中的最后两节课噢!!!!!!2.操作方法 打开element官网 https://element.eleme.cn/…

TRC丨艾美捷TRC 那非那韦亚砜说明书

艾美捷TRC Nelfinavir Sulfoxide 是 Nelfinavir Mesylate (N389750) 的杂质。Nelfinavir USP 相关化合物 A。 艾美捷TRC 那非那韦亚砜化学性质: 目录号N389770 化学名称那非那韦亚砜 同义词(3S,4aS,8aS)-N-(1,1-二甲基乙基)十氢-2-[(2R,3R)-2-羟基-3-[(3-羟基-2-…

合宙AIR32F103CBT6刷回CMSIS-DAP固件以及刷ST-LINK V2-1固件方法

合宙AIR32F103CBT6刷回CMSIS DAP固件以及刷ST-LINK V2-1固件方法📌官方介绍文档:https://wiki.luatos.com/chips/air32f103/index.html📍原理图:https://cdn.openluat-luatcommunity.openluat.com/attachment/20220605164915340_AIR32CBT6.pd…

从零备战蓝桥杯——动态规划(递推篇)

双非刷leetcode备战2023年蓝桥杯,qwq加油吧,无论结果如何总会有收获!一起加油,我是跟着英雄哥的那个思维导图刷leetcode的,大家也可以看看所有涉及到的题目用leetcode搜索就可以哦,因为避让添加外链,一起加…

简历石沉大海?来围观月薪 20k 的软件测试工程师真实简历...

​前言:面试的重要性 在互联网公司,你面试的时候能拿到多少 k 薪资,基本上决定了你未来 1-2 年的工资,这个非常现实。软件测试工程师在企业中俩内年想涨工资非常难的,就算有涨,涨幅也不大。当然不排除你待…