全面掌握 Spring IoC:原理、配置方式、依赖注入与应用优势深度解读

news/2025/1/24 15:39:07/文章来源:https://www.cnblogs.com/java-note/p/18689603

Spring IoC(Inverse of Control,控制反转)是Spring框架的核心功能之一。

定义与概念

  • 控制反转:是一种设计思想,将对象的创建和对象之间的依赖关系的管理从应用程序本身转移到外部容器。在传统编程中,对象A如果依赖对象B,那么对象A通常会在内部自行创建或查找对象B。而在IoC模式下,对象A不再负责获取或创建它所依赖的对象B,而是由一个外部的IoC容器来负责创建和注入对象B到对象A中。
  • 依赖注入(Dependency Injection,DI):是实现IoC的一种具体方式,它是指容器在创建对象时,将其所依赖的对象通过构造函数、方法参数或属性等方式注入到该对象中。

Spring IoC容器

  • 容器的作用:Spring IoC容器负责创建、管理和维护对象的生命周期以及对象之间的依赖关系。它就像是一个对象工厂,根据配置信息或注解来创建对象,并将它们装配在一起。
  • 主要接口
    • BeanFactory:是Spring IoC容器的基础接口,提供了基本的容器功能,如获取Bean等。它采用延迟加载的方式,只有在真正需要使用某个Bean时才会创建它。
    • ApplicationContext:是BeanFactory的子接口,它除了具备BeanFactory的所有功能外,还提供了一些额外的功能,如支持国际化、事件发布等。通常在Spring应用中,会优先使用ApplicationContext作为IoC容器。

配置方式

  • XML配置:通过XML文件来定义Bean及其属性、依赖关系等。例如:
<bean id="userService" class="com.example.UserServiceImpl"><property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.example.UserDaoImpl"/>
  • 注解配置:在类、方法或字段上使用注解来标识Bean以及注入依赖。如@Component@Service@Repository@Autowired@Qualifier等。示例如下:
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;//...
}
  • Java配置:使用Java类和注解来替代XML进行配置。通过@Configuration@Bean等注解来定义Bean。例如:
@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserServiceImpl(userDao());}@Beanpublic UserDao userDao() {return new UserDaoImpl();}
}

Bean的生命周期

  • 实例化:容器根据配置信息创建Bean的实例。
  • 属性赋值:将Bean的属性值和依赖关系注入到实例中。
  • 初始化:如果Bean实现了InitializingBean接口,会调用其afterPropertiesSet方法;也可以通过@PostConstruct注解标记的方法进行初始化操作;还可以在配置中指定init-method属性来指定初始化方法。
  • 使用:Bean可以在应用中被使用,处理各种业务逻辑。
  • 销毁:当容器关闭时,如果Bean实现了DisposableBean接口,会调用其destroy方法;也可以通过@PreDestroy注解标记的方法进行销毁操作;还可以在配置中指定destroy-method属性来指定销毁方法。

依赖注入方式

  • 构造函数注入:通过Bean的构造函数来注入依赖。例如:
public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}//...
}
  • Setter方法注入:通过Bean的Setter方法来注入依赖。如下所示:
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}//...
}
  • 字段注入:直接在字段上使用@Autowired等注解进行注入。如前面的注解配置示例所示。

作用域

  • singleton:单例模式,在整个容器中,只会创建一个Bean实例,所有对该Bean的请求都返回同一个实例。
  • prototype:原型模式,每次请求获取Bean时,都会创建一个新的实例。
  • request:在一次HTTP请求范围内有效,每个请求都会创建一个新的Bean实例。仅适用于Web应用。
  • session:在一个HTTP Session范围内有效,同一个Session中获取的是同一个Bean实例。仅适用于Web应用。
  • application:在ServletContext范围内有效,整个Web应用共享一个Bean实例。仅适用于Web应用。

优势

  • 解耦对象之间的依赖关系:使得代码的可维护性和可扩展性更强,当某个对象的依赖关系发生变化时,只需要在配置或注解中进行修改,而不需要在大量的代码中进行查找和修改。
  • 提高代码的可测试性:可以很方便地为被测试对象注入模拟的依赖对象,从而更容易编写单元测试。
  • 便于管理和维护对象:Spring IoC容器集中管理对象的创建和生命周期,使得整个应用的对象结构更加清晰,易于理解和管理。

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

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

相关文章

查看Resources.resx的三种方式

同一个Resources.resx文件在Visual Studio 中可以以多种方式查看, 但某一天遇到了问题, 只能以资源浏览器的方式查看, 期初还以为是Visual Studio升级加入的新功能, 怎么都无法打开设计器, 在Resources.resx文件右键菜单中看不到下面的菜单项,经过一些列的摸索, 发现设置…

Vmware 虚拟机克隆注意事项-CentOS7

1.克隆后修改MAC地 2.修改 UUID,UUID克隆虚拟机后一般是一样的,需要进行修改 输入命令uuidgen,将生成的UUID写入ifcfg-ens33 【文件位置:/etc/sysconfig/network-scripts/ifcfg-ens33】 【我克隆的时候并没有修改,但是也一样可以联网,不知道为啥】 3.修改主机名 先临时修…

autocad Ribbon创建的一种新思路

之前开发的功能相对简单, 一个RibbonTab就把相关的功能展示出来了。 目前着手准备开发的功能, 需要多个RibbonTab, 且不想显示AutoCAD或Civil 3D自身的RibbonTab, 曾经想模拟3d3s的样子来切换RibbonTab, 但发现3d3s是将AutoCAD原生的Cuix和自己的RibbonTab结合到一起, 对…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。 分布式网关的特点(相对于本地网关):提供服务路由能力 提供各种拦截支持1、分布式网关推荐 建议使用专业的分布…

Mac安装Prometheus + Grafana

一、安装Prometheus 1、下载安装 brew install prometheus2、安装路径 /opt/homebrew/Cellar/prometheus/3.1.0 3、修改配置文件 默认配置文件路径:/opt/homebrew/etc/prometheus.yml global:scrape_interval: 15sscrape_configs:- job_name: "prometheus"static_co…

Python基础6——装饰器(续) 递归 模块

1.函数1.1 参数当默认参数的值为可变类型时慎用# 不推荐使用以下代码 def func(data, value=[]):pass可以将默认参数的值改为None# 推荐使用以下代码 def func(data, value=None):if not value:value = []案例def func(data, value=[]):value.append(data)return valuev1 = fun…

C# Winform 在 Pancel 上绘制矩形

在C#的WinForms应用程序中,Panel控件本身不直接支持绘图功能,因为它不是一个绘图控件。不过,你可以通过在Panel上覆盖(override)OnPaint方法或者使用Graphics对象来在Panel上绘制图形。下面是如何实现这两种方法的示例: 方法1:覆盖OnPaint方法 可以通过重写Panel的OnPai…

SpringBoot使用SSE流,打tar包发版后出现问题

SpringBoot使用SSE流,打tar包发版后出现问题 以下纯个人实践,如有问题,还望指正~ 出现的问题 出现原因:本地调试SSE推送数据没有问题,但是通过打包为tar包发版之后,出现了以下报错: 主要问题就是: java.lang.IllegalArgumentException: Async support must be enabled …

【每日一题】20250124

读书就是这样好,无论心不在焉,板着长脸,只要考试及格,就是一个及格的人。【每日一题】 1.(20分) \(\hspace{0.6cm}\)如图所示,质量 \(M=2 \; \mathrm{kg}\) 的滑块套在光滑的水平轨道上,质量 \(m=1 \; \mathrm{kg}\) 的小球通过长 \(L=0.5 \; \mathrm{m}\) 的轻质细杆与…

Golang sync.pool源码解析

sync.Pool 是 Go 中用于对象复用的工具,可减少频繁创建和销毁对象的开销,从而优化内存使用和降低 GC 压力。本文通过分析其用法、真实案例及源码结构,详细解读了 sync.Pool 的读写流程及其背后的高效设计思想,为性能优化提供了实用参考。Golang sync.pool源码解析 - sync.p…

从靶场到实战:双一流高校多个高危漏洞

本文结合其它用户案例分析讲解挖掘某双一流站点的过程,包含日志泄露漏洞深入利用失败,到不弱的弱口令字典进入后台,再到最后偶遇一个貌似只在靶场遇到过的高危漏洞。本文结合其它用户案例分析讲解挖掘某双一流站点的过程,包含日志泄露漏洞深入利用失败,到不弱的弱口令字典…

Nginx 架构和安装

1.1 Nginx 概述 1.1.1 Nginx 介绍 Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus ) 2019年3月11日 F5 Networks 6.7亿美元的价格收购 Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器 解决C10K问题(10K Connect…