Spring之IOC

news2024/11/27 16:51:31

IoC(Inverse of Control:控制反转)是一种设计思想,就是 原本在程序中手动创建对象的控制权,交由Spring框架来管理。 IoC 在其他语言中也有应用,并非 Spirng 特有。 IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象

使用 ApplicationContext,它是 BeanFactory 的子类,更好的补充并实现了 BeanFactory ,BeanFactory可以理解为一个HashMap,key:bean name value:bean object,它只有get put两个功能,所以被称为低级容器,ApplicationContext 继承了多个接口,所以称为高级容器,可以从classpath 和 fileSystem 加载配置文件

何为控制,控制的是什么?

  • 是bean的创建、管理的权利,控制bean的整个生命周期

何为反转,反转了什么?

  • 把这个权利交给了 Spring 容器,而不是自己去控制,就是反转

何为依赖,依赖的是什么?

  • 程序运行需要依赖外部的资源,提供程序内对象的所需要的数据、资源

何为注入,注入了什么?

  • 配置文件把资源从外部注入到内部,容器加载了外部的文件、对象、数据,然后把这些资源注入给程序内的对象,维护了程序内外对象之间的依赖关系
  • 对象在容器中默认是单例的
  • 容器中的对象是启动容器的时候,就已经创建好了所有的对象,使用反射clazz.getDeclaredConstructor().newInstance() 创建

依赖注入的方式

  • 手动注入
    • xml、注解配置元信息
  • 自动注入
    • Autowiring

依赖注入的类型

  • setter注入:<property>
  • 构造器注入:<construct-arg>
  • 接口注入:实现ApplicationContextAware接口
  • 方法注入:@Autowired @Bean @Resource

自动装配模式

  • no:(默认)无自动装配。Bean 引用必须由ref元素定义。对于大型部署,建议不要更改默认设置,因为明确指定协作者可以提供更好的控制和清晰度。在某种程度上,它记录了系统的结构
  • byName:按属性名称自动布线。Spring 寻找与需要自动装配的属性同名的 bean。例如,如果一个 bean 定义被设置为按名称自动装配,并且包含一个master属性(即,它具有setMaster(..)方法),那么 Spring 将查找一个名为master的 bean 定义并使用它来设置属性
  • byType:如果容器中恰好存在一个该属性类型的 bean,则使该属性自动装配。如果存在多个错误,则会引发致命异常,这表明您可能不对该 bean 使用byType自动装配。如果没有匹配的 bean,则什么也不会发生(未设置该属性)
  • constructor:类似于byType,但适用于构造函数参数。如果容器中不存在构造函数参数类型的一个 bean,则将引发致命错误

Spring 中的 bean 的作用域有哪些?

  • singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。
  • prototype : 每次请求都会创建一个新的 bean 实例。
  • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
  • session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
  • global-session: 全局 session 作用域,仅仅在基于 Portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码(例如:HTML)片段的小型 Java Web 插件。它们基于 portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 portlet 都有不同的会话。

Spring bean 的生命周期

对于 Spring Bean 的生命周期简单来说来说就包含以下四个步骤:

  • 实例化 Instantiation
  • 属性赋值 Populate
  • 初始化 Initialization
  • 销毁 Destruction

Spring Bean 生命周期流程图

看到一个拟人化的流程讲解,感觉很形象,来自后面参考的一篇博文

构造器注入和 Setter 注入有啥区别?更推荐什么方式?

  • 在Setter注入,可以将依赖项部分注入,构造方法注入不能部分注入
  • 使用setter注入不能保证类的所有的属性都注入进来
  • 在类对象相互依赖的时候可以通过Setter方式解决循环依赖问题

怎么解决多个类型相同的bean注册到Spring容器的使用问题?

  • @Qualifier注解来指定哪一个bean或者实现bean的逻辑分组

Spring 容器工厂分为两种:ApplicationContext、BeanFactory。异同点:

  • 1. BeanFactory 在启动的时候不会去实例化 Bean,ApplicationContext 在启动的时候会。
  • 2. BeanFacotry 是 spring 中比较原始的 Factory,无法支持 spring 的许多插件,如 AOP 功能、Web 应用等。 ApplicationContext 支持

IOC的优缺点

  • 优点:
    • 对于单例的对象,不浪费空间
    • 降低组件之间的耦合度
    • 统一配置,便于管理修改
  • 缺点:
    • 对象生成使用反射,在效率上有些损耗

Bean的生命周期感兴趣,可以看看​​AbstractApplicationContext​​​类里的​​refresh​​​方法,这个方法是AplicationContext容器初始化的关键点。在这个方法里,调用了​​finishBeanFactoryInitialization​​​方法,这个方法里调用了​​getBean​​​方法,​​getBean​​​方法里调用了​​AbstractBeanFactory​​​的​​getBean​​方法,最终经过一阵七拐八绕,到达了我们的目标——Bean创建的方法:​​doCreateBean​​​方法,在这个方法里可以看到Bean的实例化,赋值、初始化的过程,至于最终的销毁,可以看看​​ConfigurableApplicationContext#close()​​

 看到两个讲的特别好的文档,共勉,里面也有调用实现case,这里不做重复赘述

 一文读懂 Spring Bean 的生命周期

Spring Bean生命周期,好像人的一生

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

服务攻防-应用协议RsyncSSHRDPFTP漏洞批扫口令猜解

目录 测试思路 &#xff08;一&#xff09;口令猜解——SSH&RDP&FTP Demo: &#xff08;二&#xff09;配置不当-未授权访问-Rsync 文件备份 尝试读取src文件 &#xff08;三&#xff09;协议漏洞-应用软件-FTP&Proftpd 搭建 &#xff08;四&#xff09;协议漏…

音视频- iOS使用metal渲染图像(一)

概要 本文主要总结一下Metal的基本使用&#xff0c;用来渲染拍照的到的图像&#xff0c;其中涉及到的有UIKit中的MTKView&#xff0c;Metal中负责渲染的几个类&#xff0c;使用MSL&#xff08;Metal Shading Language&#xff09;编写着色器&#xff0c;最终将图片渲染出来…

Python 绘制极坐标图(玫瑰花图优化)

风速的玫瑰花图可见 Matlab 绘制风速、风向统计玫瑰花图 在今天的这边博文,选用Python工具,绘制玫瑰花图,并对图进行优化。 example 1 【不规则宽度】N = 20 theta = np.linspace(0.0,2*np.pi,N,endpoint=False)

Jmeter(十五):jmeter场景的运行方式(GUI运行和命令行运行)命令行相关参数

jmeter场景的运行方式(GUI运行和命令行运行) 运行方式&#xff1a; GUI运行&#xff1a;通过图形界面方式运行&#xff0c;该运行方式的可视化界面及监听器动态展示 结果都比较消耗负载机资源&#xff0c;建议大并发时不用&#xff0c;一般进行脚本调试&#xff1b; 命令行运…

【PTA-训练day17】L2-029 特立独行的幸福 + L1-071 前世档案

L2-029 特立独行的幸福 - 递归/模拟 判断素数 PTA | 程序设计类实验辅助教学平台 思路&#xff1a; 第一层循环是边界循环 for(int il;i<r;i)枚举每一个i 第二层循环是判断这个i是不是幸福数st数组 判定 i 这个数在迭代过程中是否出现循环 如果出现循环及时跳出比如&…

【TypeScript系列】【一篇就够】TypeScript知识点总结(二)

12 面向对象简介 简而言之&#xff0c;面向对象就是程序之中所有的操作都需要通过对象来完成。 举例来说&#xff0c; 操作浏览器要使用windows对象&#xff1b;操作网页要使用document对象&#xff1b;操作控制台要使用console对象。一切操作都要通过对象&#xff0c;也就是…

nacos--扩展--03--系统参数

nacos–扩展–03–系统参数 1、Nacos Server 配置参数位置&#xff1a;{nacos.home}/conf/application.properties里注意&#xff1a;如果参数名后标注了(-D)的&#xff0c;则表示是 JVM 的参数&#xff0c;需要在{nacos.home}/bin/startup.sh里进行相应的设置。 案例&#xf…

测试用例等级怎么划分?别再傻傻的一脸懵逼

我们都知道测试工程师最基本的能力便是编写测试用例&#xff0c;可是看似简单的用例&#xff0c;后面其实蕴含这个很多人忽略的细节&#xff0c;今天就来说测试里面所蕴含的很多细节。 很多时候不只是测试和测试用例息息相关&#xff0c;开发&#xff0c;产品也有的时候对于测试…

C/C++程序的断点调试 - CodeBlocks

本文以CodeBlocks为例&#xff0c;简述C/C程序断点调试的基本方法和过程。其它的IDE环境&#xff0c;大同小异。 本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载&#xff0c;但需要注明原作者"海洋饼干叔 叔"&#xff1b;本文不允许…

单链表翻转-链表篇

leetcode206单链表的翻转 题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出…

如何指定标签在页面中显示的位置

如何指定标签在页面中显示的位置 在HTML页面设计中常常需要调整标签&#xff08;元素&#xff09;的位置&#xff0c;那么&#xff0c;如何指定标签在页面中显示的位置呢&#xff1f; 使用标签的align属性指定标签在页面中显示的位置&#xff0c;如align"left|right|cen…

02加锁源码分析-ReentrantReadWriteLock原理-AQS-并发编程(Java)

文章目录3.1 加锁3.1.1 读锁加锁3.1.1.1 tryAcquireShared()3.1.1.2 readerShouldBlock()3.1.1.3 fullTryAcquireShared()3.1.1.4 doAcquireShared()3.1.2 写锁加锁3.1.2.1 tryAcquire()3.1.2.2 acquireQueued()3.2 加锁示意图3.2.1 先写锁在读锁3.2.2 先读锁在写锁后记3.1 加锁…

全网惟一面向软件测试人员的Python基础教程-Python数据类型中有那些故事呢?

全网惟一面向软件测试人员的Python基础教程 起点&#xff1a;《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗&#xff1f; 第四章 Python数据类型中有那些故事呢&#xff1f;…

PHP+Laravel框架RabbitMQ简单使用

RabbitMQ安装教程请转到&#xff1a;RabbitMQ安装教程&#xff08;超详细&#xff09; 1、创建生产者 在app/Http/Controllers里创建一个php控制器文件&#xff0c; namespace App\Http\Controllers;use App\Http\Controllers\Controller; //引入amqp扩展 use PhpAmqpLib\Co…

铁路轨道交通智慧管理系统

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

sklearn基础篇(九)-- 主成分分析(PCA)

1 引言 降维是对数据高维度特征的一种预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。在实际的生产和应用中&#xff0c;降维在一定的信息损失范围内&#xff0c;可以为我们节省大量的…

机器学习项目中Xgboost深入理解(二)梯度及GB的理解

Xgboost 与 GBDT同源&#xff0c;那么所谓的梯度是什么意思呢&#xff1f;G、B又代表什么。 1. 梯度Gradient 梯度是一个向量&#xff08;矢量&#xff09;&#xff0c;表示梯度是方向导数在某一点的最大值。理解为某函数&#xff08;可以指损失函数&#xff09;在某点处的方…

Fluent后处理的色谱设置

PART 1 概述 对物理场的空间分布进行可视化展示&#xff0c;在科研、工程等领域是必不可少的环节。 将物理量不同数值赋予不同色彩&#xff0c;是一种很常见的物理场可视化方法。通过色彩的变化&#xff0c;即可识别物理量的分布规律。 物理量数值和颜色之间的对应关系称为色…

Linux常用指令

目录 1.1关于目录操作的指令 1.2文件操作的指令 1.3创建/删除目录操作 1.4目录/文件的移动/复制/改名 1.5 vim对文件进行编辑 1.1关于目录操作的指令 ls 列出当前目录下都有啥 ls 具体路径或 /注意中间含有一个空格&#xff0c;列出跟目录下或指定路径的内容 ls -l / 以列表的…

mysql日志篇

mysql日志篇1、Undo-log 撤销日志 Undo即撤销的意思&#xff0c;大家通常也习惯称它为回滚日志。如果大家有仔细研究过 MySQL 的日志&#xff0c;应该会发现 Undo-log 并不存在单独的日志文件&#xff0c;也就是磁盘中并不会存在 xx-undo.log 这类的文件&#xff0c;那 Undo-lo…