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

Spring——和IoC相关的特性

目录

IoC中Bean的生命周期

实例化(Instantiation)

属性注入(Populate Properties)

初始化(Initialization)

使用(Bean in Use)

销毁(Destruction)

Lazy-init和预实例化

FactoryBean和BeanFactory

BeanFactory

FactoryBean

BeanPOSTProcessor的妙用

Spring的Autowiring

1. 使用autowire属性(XML配置):

2. 使用@Autowired注解(注解配置):

3. 使用@Resource注解(注解配置):

4. 使用Java配置类(Java配置):

Bean对IoC容器的感知


IoC中Bean的生命周期

Spring IOC 中 Bean 的⽣命周期⼤致分为四个阶段:实例化(Instantiation)、属性赋值(Populate)、初始化 (Initialization)、销毁(Destruction)。

  1. 实例化(Instantiation)
    当容器启动时,它会创建Bean的实例。这个阶段包括对象的构造函数调用。
  2. 属性注入(Populate Properties)
    容器会通过属性注入(Dependency Injection)来设置Bean的属性值。这通常包括依赖关系的注入,如通过构造函数注入或setter方法注入依赖的对象。
  3. 初始化(Initialization)
    如果Bean实现了InitializingBean接口,容器会调用其afterPropertiesSet方法。或者,如果Bean配置了init-method,容器也会在此时调用指定的初始化方法。
  4. 使用(Bean in Use)
    Bean实例现在处于可用状态,可以被其他Bean引用和使用。
  5. 销毁(Destruction)
    当容器关闭或不再需要Bean实例时,容器会销毁Bean实例。这个阶段包括对象的销毁和资源的释放。
Lazy-init和预实例化

在Spring的IoC容器中,可以通过两种方式来控制Bean的初始化时机:Lazy Initialization(延迟初始化)和Eager Initialization(预实例化)。这两种方式决定了容器在启动时是否立即实例化和初始化Bean。

  1. Lazy Initialization(延迟初始化): 在延迟初始化中,Bean实例仅在第一次访问时才会被实例化和初始化。这意味着容器在启动时不会创建所有Bean实例,而只有在需要时才会创建。这可以减少启动时间和系统资源的消耗。BeanFactory是延迟加载。

  2. Eager Initialization(预实例化): 在预实例化中,容器在启动时会创建并初始化所有Bean实例,即使这些Bean可能在后续的应用程序执行过程中并不会被立即使用。这可以确保所有Bean在应用程序启动时都处于可用状态,但可能会增加启动时间和系统资源的消耗。

    预实例化是默认行为,如果不明确配置延迟初始化,容器将采用预实例化方式。如果需要显式配置Bean为延迟初始化,可以参考上述的lazy-init配置。ApplicationContext是预加载。

FactoryBean和BeanFactory
BeanFactory
  1. BeanFactory 是Spring框架的核心接口之一,它是IoC容器的底层基础。它的主要作用是管理Bean的生命周期,包括实例化、依赖注入、初始化和销毁等。

  2. BeanFactory 是一个工厂接口,它定义了访问和管理Bean的方法,包括 getBeancontainsBeanisSingletonisPrototype 等。

  3. BeanFactory 不负责Bean的创建,而是负责Bean的获取和生命周期管理。它是IoC容器的核心接口,提供了基本的Bean管理功能。

FactoryBean
  1. FactoryBean 也是Spring框架中的一个接口,但它的作用不同于 BeanFactoryFactoryBean 用于创建和管理特定类型的Bean,通常是复杂的或自定义的Bean。

  2. FactoryBean 接口要求实现类必须实现 getObject 方法,该方法定义了如何创建和返回Bean实例。

  3. FactoryBean 的实现类通常被称为"工厂Bean",它负责创建其他Bean的实例,这些Bean的类型可以与工厂Bean不同。

  4. 通过实现 FactoryBean 接口,你可以自定义Bean的创建逻辑,将其封装在工厂Bean中,然后将工厂Bean注册到Spring容器中。

总的来说,BeanFactory 是Spring容器的核心接口,用于管理Bean的生命周期,而 FactoryBean 是用于创建和管理特定类型的Bean的接口。FactoryBean 允许你封装复杂的Bean创建逻辑,而 BeanFactory 负责整个容器的基本Bean管理。在实际开发中,你会更频繁地与 BeanFactory 打交道,而 FactoryBean 则用于特殊需求下的自定义Bean创建。

BeanPOSTProcessor的妙用

BeanPostProcessor 是Spring框架中的一个接口,用于扩展和自定义Bean的初始化过程。通过实现 BeanPostProcessor 接口,你可以在容器实例化、依赖注入和初始化Bean的过程中插入自定义的处理逻辑。这些处理逻辑可以在Bean的初始化之前和之后执行,允许你对Bean进行额外的处理。

BeanPostProcessor 接口定义了以下两个方法:

  1. postProcessBeforeInitialization(Object bean, String beanName) 在Bean的初始化之前被调用。你可以在这个方法中进行一些前置处理,如修改Bean的属性值或检查Bean的状态。

  2. postProcessAfterInitialization(Object bean, String beanName) 在Bean的初始化之后被调用。你可以在这个方法中进行一些后置处理,如注册Bean的代理、包装Bean等

简单示例:

import org.springframework.beans.factory.config.BeanPostProcessor;
​
public class CustomBeanPostProcessor implements BeanPostProcessor {
​@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// 在初始化之前执行的逻辑if (bean instanceof MyBean) {MyBean myBean = (MyBean) bean;myBean.setSomeProperty("Modified Value");}return bean;}
​@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {// 在初始化之后执行的逻辑return bean;}
}
​

要使用自定义的 BeanPostProcessor,你需要将其注册到Spring容器中。这可以通过XML配置文件或Java配置类来完成,如下所示:

<bean class="com.elaine.CustomBeanPostProcessor"/>

或者在Java配置类中:

@Configuration
public class AppConfig {
​@Beanpublic CustomBeanPostProcessor customBeanPostProcessor() {return new CustomBeanPostProcessor();}
}

通过注册 BeanPostProcessor,你可以在Bean的初始化过程中执行自定义的处理逻辑,从而实现对Bean的扩展和定制。这对于AOP、事务管理、日志记录等方面非常有用。

Spring的Autowiring

Spring的自动装配(Autowiring)是一种机制,它允许Spring容器自动为Bean注入依赖。这样,你无需手动指定依赖关系,Spring会根据类型、名称或其他规则自动完成依赖注入。自动装配可以通过XML配置、注解和Java配置来实现,以下是一些示例:

1. 使用autowire属性(XML配置):

在XML配置文件中,可以使用autowire属性来指定自动装配方式。以下是一些autowire属性的取值:

  • no(默认值):不进行自动装配,你需要显式地配置依赖关系。

  • byName:按照属性名进行自动装配,容器会查找和属性名匹配的Bean,并注入到属性中。

  • byType:按照属性的数据类型进行自动装配,容器会查找和属性类型匹配的Bean,并注入到属性中。

  • constructor:类似byType,但是用于构造函数的参数自动装配。

<bean id="user" class="com.elaine.User" autowire="byName"><!-- user类的属性会自动装配 -->
</bean>
2. 使用@Autowired注解(注解配置):

通过@Autowired注解,你可以在类的字段、构造函数或方法上标记需要自动装配的依赖。

@Component
public class UserService {
​@Autowiredprivate UserDao userDao;
​public void saveUser(User user) {userDao.saveUser(user)}// ...
}
3. 使用@Resource注解(注解配置):

@Resource注解也可以用于自动装配,它支持按照Bean的名称或类型来查找依赖。

@Component
public class CustomerService {
​@Resourceprivate UserService userService;
​// ...
}
4. 使用Java配置类(Java配置):

通过Java配置类,你可以使用@Autowired注解和@Bean注解来定义Bean并注入依赖。

@Configuration
@ComponentScan(basePackages = "com.elaine")
public class AppConfig {
​@Autowiredprivate DataConnection dataConnecttion;
​@Beanpublic DataSource dataSource(DataConnection dataConnecttion) {return new DataSource(dataConnecttion);}
}

自动装配的具体实现依赖于Spring容器的类型和配置方式。Spring会根据配置和注解来识别依赖关系,并自动完成依赖注入。这提高了应用程序的可维护性和可扩展性,减少了手动配置的工作量。

Bean对IoC容器的感知

当一个Bean实现了Spring框架的 org.springframework.beans.factory.BeanNameAwareorg.springframework.beans.factory.BeanFactoryAware 接口时,它可以获得对IoC容器的一定程度的"感知"。这意味着该Bean可以获取关于自己的一些信息或与容器交互(在Bean中直接对IoC容器进行操作)。

以下是这两个接口的作用:

  1. BeanNameAware 接口: 当一个Bean实现 BeanNameAware 接口时,Spring容器在将Bean实例化后,会调用该Bean的 setBeanName(String name) 方法,并将该Bean在容器中的名称(ID)作为参数传递给方法。这样,Bean就可以获得自己在容器中的名称。

  2. BeanFactoryAware 接口: 当一个Bean实现 BeanFactoryAware 接口时,Spring容器在将Bean实例化后,会调用该Bean的 setBeanFactory(BeanFactory beanFactory) 方法,并将容器的Bean工厂作为参数传递给方法。这允许Bean与容器进行更多的交互,例如获取其他Bean实例。

相关文章:

Spring——和IoC相关的特性

目录 IoC中Bean的生命周期 实例化&#xff08;Instantiation&#xff09; 属性注入&#xff08;Populate Properties&#xff09; 初始化&#xff08;Initialization&#xff09; 使用&#xff08;Bean in Use&#xff09; 销毁&#xff08;Destruction&#xff09; Laz…...

在 TensorFlow 中调试

如果调试是消除软件错误的过程&#xff0c;那么编程一定是添加错误的过程。Edsger Dijkstra。来自 https://www.azquotes.com/quote/561997 一、说明 在这篇文章中&#xff0c;我想谈谈 TensorFlow 中的调试。 在之前的一些帖子&#xff08;此处、此处和此处&#xff09;中&…...

想要精通算法和SQL的成长之路 - 连续的子数组和

想要精通算法和SQL的成长之路 - 连续的子数组和 前言一. 连续的子数组和1.1 最原始的前缀和1.2 前缀和 哈希表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 连续的子数组和 原题链接 1.1 最原始的前缀和 如果这道题目&#xff0c;用前缀和来算&#xff0c;我们的思路…...

【C++】头文件chrono

2023年10月16日&#xff0c;周一晚上 当前我只是简单的了解了一下chrono 以后可能会深入了解chrono并更新文章 目录 功能原理头文件chrono中的一些类头文件chrono中的数据类型一个简单的示例程序小实验&#xff1a;证明a的效率比a高 功能 这个chrono头文件是用来处理时间的…...

Python学习六

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…...

Springboot 集成 WebSocket

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直接可以创建持久性的连接…...

谨以此篇,纪念我2023年曲折的计算机保研之路

目录 阶段一&#xff1a;迷茫阶段二&#xff1a;准备个人意愿保研材料准备套磁老师5.1日 浙大线上编程测试5.8日 浙大线上面试 —— 一面5.17日 浙大线上面试——二面5.29日 实验室面试结果5.27日 南开线上面试6.20日 华师电话面试 阶段三&#xff1a;旅途北航CS&#xff08;6.…...

VSS、VDD、VBAT、VSSA

引言 在学习设计TM32时&#xff0c;发现芯片除了GPIO引脚外还会引出许多引脚&#xff0c;以STM32F407ZGT6为例除了GPIO引脚还会有以下引脚 如VSS、VDD、VBAT、VSSA、NRST、VREF、VDDA、VCAP_1、VCAP_2、PDR_ON这些引脚。他们有何作用&#xff0c;电路设计中应如何连接&#x…...

【Rust基础③】方法method、泛型与特征

文章目录 6 方法 Method6.1 定义方法self、&self 和 &mut self 6.2 自动引用和解引用6.3 关联函数 7 泛型和特征7.1 泛型 Generics7.1.1 结构体中使用泛型7.1.2 枚举中使用泛型7.1.3 方法中使用泛型为具体的泛型类型实现方法 7.1.4 const 泛型 7.2 特征 Trait7.2.1 为类…...

48.排列问题求解

思路分析&#xff1a;通过为每一队分配一个id&#xff0c;join条件要求t1.num < t2.num实现相同两队只比一次 代码实现&#xff1a; with t as (SELECT team_name,caseteam_nameWHEN 勇士 then 1WHEN 湖人 then 2WHEN 灰熊 then 3else 4end numFROM team )SELECT t1.team_…...

18.(开发工具篇Gitlab)Git如何回退到指定版本

首先: 使用git log命令查看提交历史,找到想要回退的版本的commit id. 使用git reset命令 第一步:git reset --hard 命令是强制回到某一个版本。执行后本地工程回退到该版本。 第二步:利用git push -f命令强制推到远程 如下所示: 优点:干净利落,回滚后完全回到最初状态…...

IDEA初始配置

1. 详细设置 安装完IDEA之后的简单配置。 1.1 如何打开详细配置界面 1、显示工具栏 2、选择详细配置菜单或按钮 1.2 系统设置 1、默认启动项目配置 启动IDEA时&#xff0c;默认自动打开上次开发的项目&#xff1f;还是自己选择&#xff1f; 如果去掉Reopen projects on …...

WM_COPYDATA传回返回值的一个方案

方案背景 适应场景&#xff0c;通过WM_COPYDATA进行进程间通信时&#xff0c;SendMessage不能返回自定义的数据&#xff0c;由此想到以下思路解决这个问题 A进程使用VirtualAlloc分配一块内存&#xff0c;通过某种方式将此地址以及A进程ID传给另一个进程B B进程使用OpenProce…...

【日常业务开发】接口性能优化

【日常业务开发】接口性能优化 缓存本地缓存分布式缓存 数据库分库分表SQL 优化 业务程序并行化异步化池化技术预先计算事务粒度批量读写锁的粒度尽快return上下文传递空间换时间集合空间大小 缓存 本地缓存 本地缓存&#xff0c;最大的优点是应用和cache同一个进程内部&…...

Android 10.0 禁止弹出系统simlock的锁卡弹窗功能实现

1.前言 在10.0的系统开发中,在一款产品中,需要实现simlock锁卡功能,在系统实现锁卡功能以后,在开机的过程中,或者是在插入sim卡 后,当系统检测到是禁用的sim卡后,就会弹出simlock锁卡弹窗,要求输入puk 解锁密码,功能需求禁用这个弹窗,所以就需要看是 哪里弹的,禁用…...

VulnHub lazysysadmin

一、信息收集 1.nmap扫描开发端口 开放了&#xff1a;22、80、445 访问80端口&#xff0c;没有发现什么有价值的信息 2.扫描共享文件 enum4linux--扫描共享文件 使用&#xff1a; enum4linux 192.168.103.182windows访问共享文件 \\192.168.103.182\文件夹名称信息收集&…...

ppt怎么压缩到10m以内?分享ppt缩小方法

在日常工作中&#xff0c;我们常常需要制作和分享PowerPoint演示文稿&#xff0c;然而&#xff0c;有时候文稿中的图片、视频等元素会导致文件过大&#xff0c;无法在电子邮件或其他平台上顺利传输。为了将PPT文件压缩到10M以内&#xff0c;我们可以使用一些专门的文件压缩工具…...

智能警用装备管理系统-科技赋能警务

警用物资装备管理系统&#xff08;智装备DW-S304&#xff09;是依托互云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对警用装备进行统一管理、分析的信息化、智能化、规范化的系统。 &#xff08;1&#xff09;感知智能化 装备感知是整个方案的基础&#xff0c;本方…...

攻防千层饼

近年来&#xff0c;网络安全领域正在经历一场不断升级的攻防对抗&#xff0c;这场攻防已经不再局限于传统的攻击与防御模式&#xff0c;攻击者和防守者都已经越发熟练&#xff0c;对于传统攻防手法了如指掌。 在这个背景下&#xff0c;攻击者必须不断寻求创新的途径&#xff0…...

组件封装使用?

组件封装是指在软件开发中&#xff0c;将功能代码或数据封装成一个独立的、可重用的模块或组件。这种封装可以使得代码更加模块化、可维护性和可重用性。在许多编程语言和开发框架中&#xff0c;都有不同的方式来实现组件封装。 以下是一些常见的组件封装方法和技巧&#xff1…...

springboot-vue+nodejs大学生社团管理系统

目录技术栈选择系统模块划分开发阶段安排部署与优化测试重点项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作技术栈选择 后端采用Spring Boot框架&#xff0c;提供RESTful API接口&#xff0c;处理业务逻辑与数据库交互。 前端…...

PROJECT MOGFACE效果对比:不同提示词(Prompt)工程下的输出质量

PROJECT MOGFACE效果对比&#xff1a;不同提示词&#xff08;Prompt&#xff09;工程下的输出质量 你是不是也遇到过这种情况&#xff1f;用同一个AI模型&#xff0c;别人生成的回答妙语连珠&#xff0c;你得到的却平平无奇。问题可能就出在那几句“悄悄话”——提示词上。 今…...

非线性奇异谱分解算法:精细化处理时间序列数据,提取CSV文件信号特征,生成希尔伯特谱分析报告

SSD–fft–hht&#xff0c;奇异谱分解算法&#xff0c;是对原始小波分解的一种改进&#xff0c;对小波分解中的高频部分进行二次分解&#xff0c;提高分辨率。 一种非线性时间序列分解方法&#xff0c;可用于处理各种复杂数据&#xff0c;包括金融&#xff0c;气候&#xff0c;…...

UEFITool终极指南:掌握UEFI固件解析与编辑的完整教程

UEFITool终极指南&#xff1a;掌握UEFI固件解析与编辑的完整教程 【免费下载链接】UEFITool UEFI firmware image viewer and editor 项目地址: https://gitcode.com/gh_mirrors/ue/UEFITool 想要深入了解计算机启动的底层秘密吗&#xff1f;UEFITool作为一款强大的开源…...

维纳滤波语音信号降噪Matlab程序含报告 包含6页文档报告。 使用了维纳滤波的技术去除高斯噪...

维纳滤波语音信号降噪Matlab程序含报告 包含6页文档报告。 使用了维纳滤波的技术去除高斯噪声&#xff0c; 程序可以直接运行&#xff0c;附带声音。 无需多余操作&#xff0c;点击运行即可。 程序经过多次测试&#xff0c;包成功运行&#xff0c;附带运行操作视频。最近在折腾…...

AI 模型部署中的内存瓶颈

AI模型部署中的内存瓶颈&#xff1a;挑战与优化 随着AI技术的快速发展&#xff0c;大型神经网络模型&#xff08;如GPT、ResNet等&#xff09;在各类应用中大放异彩。模型部署过程中面临的内存瓶颈问题却成为制约其广泛应用的关键因素。无论是边缘设备还是云端服务器&#xff…...

在Windows上用C++部署YOLO11模型:从PyTorch训练到QT桌面应用的全流程避坑指南

工业级YOLO11模型C部署实战&#xff1a;从PyTorch到QT6.9的工程化落地指南 当Python训练的AI模型需要真正投入生产线时&#xff0c;C部署往往成为必经之路。去年在为某电子元件制造商部署电容极性检测系统时&#xff0c;我深刻体会到从Jupyter Notebook到稳定运行的Windows桌面…...

ArcGIS重分类实战:手把手教你搞定SWAT模型土地利用数据库(附CNLUCC对照表)

ArcGIS重分类实战&#xff1a;从CNLUCC到SWAT模型土地利用数据库的完整指南 当你第一次打开SWAT模型准备进行水文模拟时&#xff0c;最令人头疼的环节之一就是处理土地利用数据。作为中国研究者&#xff0c;我们手头往往只有CNLUCC分类的土地利用栅格数据&#xff0c;而SWAT模型…...

SkyWalking TTL配置实战:如何精准控制监控数据生命周期

1. 理解SkyWalking TTL的核心价值 当你的微服务集群每天产生TB级监控数据时&#xff0c;存储成本会像野马一样失控。去年我们一个电商项目就遇到过这样的困境——仅仅三个月ES集群就撑爆了200TB磁盘空间&#xff0c;而排查问题时发现99%的监控数据其实早已失效。这正是TTL&…...

如何永久保存微信聊天记录:WeChatExporter完整解决方案

如何永久保存微信聊天记录&#xff1a;WeChatExporter完整解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因手机丢失、系统升级或误操作而丢失珍贵的微…...