Spring IoC与DI深度解析

Spring核心概念:IoC与DI深度解析 注入方式核心优点核心缺点推荐度构造器注入强制依赖、不可变、低侵入、可读性好依赖过多时参数冗长★★★★★Setter注入灵活、支持可选依赖、动态切换无法保证不可变性、依赖缺失风险★★★★☆字段注入简洁、高效、低侵入可读性差、测试困难、无法保证不可变★★★☆☆方法注入支持多依赖、灵活、适配特殊场景可读性差、使用频率低★★☆☆☆Spring支持自定义作用域,需实现Scope接口,注册到容器中,适用于特殊场景(如定时任务、分布式会话)。 阅读详情

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

在Spring框架中,IoC(控制反转)和DI(依赖注入)是两个紧密相连的核心概念。IoC是一种设计模式,它将对象的创建和依赖关系的配置从应用程序代码中分离出来,交由外部容器(如Spring容器)来管理。这种模式使得应用程序的组件更加松耦合,提高了代码的可维护性和可测试性。

IoC与DI的原理

在传统的编程模式中,对象的创建和依赖关系的配置通常在应用程序代码中完成。例如,一个服务类可能需要依赖一个数据访问对象来获取数据。在传统的编程模式中,服务类会直接创建数据访问对象,如下所示:

public class UserService {
    private DataAccessObject dataAccessObject;

    public UserService() {
        this.dataAccessObject = new DataAccessObject();
    }

    public void performService() {
        // 使用dataAccessObject执行操作
    }
}

这种方式存在几个问题:

  1. 紧耦合:UserService类与DataAccessObject类紧密耦合,如果需要更换数据访问实现,需要修改UserService类。
  2. 可测试性差:由于紧耦合,单元测试变得困难,因为需要创建具体的实现来模拟依赖。

IoC和DI通过以下方式解决了这些问题:

  • 容器管理对象:Spring容器负责创建对象,并配置它们之间的依赖关系。
  • 依赖注入:容器通过构造函数、设值方法或工厂方法将依赖关系注入到对象中。

以下是一个使用Spring容器和DI进行依赖注入的例子:

public class UserService {
    private DataAccessObject dataAccessObject;

    // 构造函数注入
    public UserService(DataAccessObject dataAccessObject) {
        this.dataAccessObject = dataAccessObject;
    }

    public void performService() {
        // 使用dataAccessObject执行操作
    }
}

// 在Spring配置文件中配置依赖关系
<bean id="userService" class="UserService">
    <constructor-arg ref="dataAccessObject"/>
</bean>

在这个例子中,Spring容器创建UserService对象时,会注入一个DataAccessObject实例。

Bean生命周期管理

Spring容器不仅负责创建和配置对象,还负责管理对象的生命周期。Spring提供了以下生命周期回调接口:

  • InitializingBean:在对象创建后调用afterPropertiesSet方法。
  • DisposableBean:在对象销毁前调用destroy方法。
  • BeanPostProcessor:在对象创建后和初始化方法之前调用postProcessBeforeInitialization和postProcessAfterInitialization方法。

以下是一个使用BeanPostProcessor的例子:

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 在初始化方法之前执行操作
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 在初始化方法之后执行操作
        return bean;
    }
}

Bean作用域

Spring容器支持多种Bean作用域,包括:

  • Singleton:默认作用域,每个Spring容器中只有一个Bean实例。
  • Prototype:每次请求时创建一个新的Bean实例。
  • Request:每个HTTP请求创建一个新的Bean实例。
  • Session:每个HTTP会话创建一个新的Bean实例。

注解驱动开发

Spring 3.0引入了基于注解的配置,使得配置更加简洁。以下是一些常用的注解:

  • @Component:用于声明一个Bean。
  • @Service:用于声明一个业务层Bean。
  • @Repository:用于声明一个数据访问层Bean。
  • @Autowired:用于自动装配依赖。

以下是一个使用注解声明Bean的例子:

@Component
public class UserService {
    private DataAccessObject dataAccessObject;

    @Autowired
    public UserService(DataAccessObject dataAccessObject) {
        this.dataAccessObject = dataAccessObject;
    }

    public void performService() {
        // 使用dataAccessObject执行操作
    }
}

Java配置

Spring 3.1引入了基于Java的配置,允许使用Java代码来配置Spring容器。以下是一个使用Java配置的例子:

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService(dataAccessObject());
    }

    @Bean
    public DataAccessObject dataAccessObject() {
        return new DataAccessObject();
    }
}

XML配置驱动

虽然注解和Java配置提供了更简洁的配置方式,但XML配置仍然是Spring框架的一部分。以下是一个使用XML配置的例子:

<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="userService" class="UserService">
        <property name="dataAccessObject" ref="dataAccessObject"/>
    </bean>

    <bean id="dataAccessObject" class="DataAccessObject"/>
</beans>

SpEL(Spring表达式语言)

SpEL是Spring框架提供的一种表达式语言,用于在运行时计算值。以下是一个使用SpEL的例子:

public class UserService {
    private DataAccessObject dataAccessObject;

    public UserService(DataAccessObject dataAccessObject) {
        this.dataAccessObject = dataAccessObject;
    }

    public void performService() {
        // 使用SpEL表达式获取属性值
        String propertyValue = "${app.config.property}";
        // 使用propertyValue执行操作
    }
}

在这个例子中,${app.config.property}是一个SpEL表达式,用于获取配置文件中app.config.property属性的值。

通过以上内容,我们可以看到Spring框架在IoC、DI、Bean生命周期管理、Bean作用域、注解驱动开发、Java配置、XML配置驱动和SpEL等方面的强大功能。这些功能使得Spring框架成为Java企业级开发的事实标准。

优快云

博主分享

📥博主的人生感悟和目标

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。

面试备战资料

八股文备战
场景描述链接
时间充裕(25万字)Java知识点大全(高频面试题)Java知识点大全
时间紧急(15万字)Java高级开发高频面试题Java高级开发高频面试题

理论知识专题(图文并茂,字数过万)

技术栈链接
RocketMQRocketMQ详解
KafkaKafka详解
RabbitMQRabbitMQ详解
MongoDBMongoDB详解
ElasticSearchElasticSearch详解
ZookeeperZookeeper详解
RedisRedis详解
MySQLMySQL详解
JVMJVM详解

集群部署(图文并茂,字数过万)

技术栈部署架构链接
MySQL使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群Docker-Compose部署教程
Redis三主三从集群(三种方式部署/18个节点的Redis Cluster模式)三种部署方式教程
RocketMQDLedger高可用集群(9节点)部署指南
Nacos+Nginx集群+负载均衡(9节点)Docker部署方案
Kubernetes容器编排安装最全安装教程

开源项目分享

项目名称链接地址
高并发红包雨项目https://gitee.com/java_wxid/red-packet-rain
微服务技术集成demo项目https://gitee.com/java_wxid/java_wxid

管理经验

【公司管理与研发流程优化】针对研发流程、需求管理、沟通协作、文档建设、绩效考核等问题的综合解决方案:https://download.youkuaiyun.com/download/java_wxid/91148718

希望各位读者朋友能够多多支持!

现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

深度学习---双层神经网络中矩阵的运算及其含义记录 深度学习---双层神经网络中矩阵的运算及其含义记录神经网络的正向传播与反向传播正向传播第一层的权重矩阵第一层的输入矩阵Z^1^ = W^1^X^1^ + b^1^A^1^ = σ(Z^1^)第二层的权重矩阵第二层的输入矩阵Z^2^ = W^2^A^1^ + b^2^反向传播dz^2^ = A^2^ - Ydw^2^ = 1/n dz^2^A^1T^db^2^ = 1/n np.sum(dz^2... 阅读详情

相关推荐

山景BP10_128DBG开发板ADC_Key驱动

最近在学习山景BP10_128DBG开发板,想使用开发板上的按键。看了看原理图和之前用过的按键好像有点不一样。常见的按键都是判断IO口是否被拉低或拉高来判断按键是否被按下。山景BP10_128DBG开发板上的按键是ADC按键,每个按键按下之后ADC的采样值是不同的,通过ADC采样回来的值进而判断哪个按键按下。这种方式核心思想就是用一个ADC通道来节约IO口,对于IO紧张的芯片是一个不错的解决思路。

weixin_56646002的博客 1308

Spring IoC与DI原理深度解析

Spring框架的IoC、DI、Bean生命周期管理、Bean作用域、BeanFactory、ApplicationContext、注解驱动开发、Java配置、XML配置驱动和SpEL等特性,为开发者提供了一种强大的编程模型,可以简化开发过程,提高代码的可维护性和可测试性。

我是Java程序员廖志伟,感谢朋友们的支持!不定期贡献一篇高品质、过万文字、图文并茂且附有视频解说、满载代码示例注释的良心之作,坚决杜绝粗制乱造。 560

Zynq-PS-SDK(12) 之 VDMA+VTC+AXI4S-VideoOut 视频通路硬件搭建

前面分别叙述了《Zynq-PS-SDK(9) 之 VDMA》、《Zynq-PS-SDK(10) 之 VTC》以及《Zynq-PS-SDK(11) 之 AXI4-Stream To Video Out》;搭建一个简单的视频通路(Framebuffer -> HDMI)就要用到这些个模块,总体的设计框图如下所示: 视频数据的 Framebuffer 在 DDR 中,通过 Processing System 写入进去; 数据通过高带宽的 AXI4 接口(这里用到了 HP AXI,即 64bits 带

StephenZhou 5589

Spring 核心概念深度解析:IOC、DI 与 AOP

摘要: Spring框架通过IOC、DI和AOP三大核心机制革新了Java开发模式。IOC将对象控制权交给容器,降低耦合度;DI作为IOC的具体实现,提供构造器、Setter和字段三种注入方式。AOP则通过切面编程解决横切关注点问题,支持五种通知类型和两种代理方式。三者协同工作,使Spring成为高效、灵活的企业级开发框架,广泛应用于日志、事务、安全等场景,显著提升代码模块化和可维护性。(149字)

Java是世界上最好的语言 1904

Excel COUNTIF函数精确统计全解析:从模糊匹配到精准计数

在数据处理与办公自动化领域,条件计数是数据分析的基础操作,其核心原理在于对特定范围内满足设定条件的单元格进行识别与汇总。Excel中的COUNTIF函数是实现这一功能的常用工具,它通过文本匹配逻辑与通配符机制来执行条件判断。然而,其默认的模糊匹配行为常导致统计结果偏离预期,这正是精确统计的技术价值所在——确保数据汇总的准确性与可靠性,直接影响业务报告、薪酬核算、销售分析等应用场景的决策质量。本文聚焦COUNTIF函数的精确匹配技巧,深入剖析通配符(如星号*和问号?)的转义使用(通过波浪号~),并针对大小写敏

weixin_29040367的博客 351

二次规划问题(qp)和序列二次规划问题(sqp)的简单理解

当二次规划的约束为非线性约束时,通常会采用sqp进行求解,用连续求解qp的方法来得到非线性约束条件下的最优解,上述的qpoases和osqp均无法直接求解非线性约束问题,所以如果使用这两个库的话,注意,sqp是结果,而不是原因,只有在非线性约束的情况下才会考虑sqp求解,如果问题本身就是线性约束,则直接用qp解就行。对于工程师而言,我们在编写代码的时候,并不关心二次规划问题的求解细节,所以一般是把二次规划问题建立好后,直接调用三方库进行求解。因为约束为非线性约束,所以先将约束进行线性化,约束原方程为。

zmhzmhzm的博客 1万+

Spring核心机制深度解析:IoC与DI的设计哲学与实践

在软件工程领域,依赖管理一直是架构设计的核心挑战。传统开发中,对象通常自行创建依赖项,导致代码高度耦合、难以测试和维护。Spring框架通过控制反转(IoC) 和依赖注入(DI) 两大核心概念,革命性地改变了Java应用的构建方式。

weixin_69555518的博客 1098

Darknet-Yolov3 移植过程

本教程面向使用寒武纪平台进行深度学习推理任务的开发者。针对当前主流检测网络darknet-yolov3,进行寒武纪平台的移植。开发者对照移植过程,能够利用寒武纪智能处理器设备完成多种场景的目标检测任务。本实验代码基于 Neuware 1.6.1 与 Python 2.7 环境。

shengyin714959的博客 438

Spring 核心深度解析:IoC, DI 与 AOP

Java@Service@OverrideJava@Service@OverrideSystem.out.println("正在处理业务逻辑:创建订单 " + productId);特性IoC / DI (控制反转/依赖注入)AOP (面向切面编程)核心目标解耦对象之间的依赖关系。解耦业务逻辑与系统级服务(如日志)。关注点关注的是类与类的纵向关系。关注的是方法层面的横向切入。实现手段反射 (Reflection)、工厂模式。动态代理 (JDK Proxy / CGLIB)。

hbx98的博客 873

ROS从入门到精通0-4:VSCode 搭建 ROS 工程环境

为了提高开发效率,可以先安装集成开发工具和使用方便的工具,本教程用VSCode搭建ROS工程环境

FRIGIDWINTER的博客 1万+

RAGFlow体验大提升:使用GPU加速

场景:在正常部署过程中,启动RAGFlow会用到docker-compose.yml文件来启动。但是在实际使用过程中,会发现RAGFlow极其的卡和笨重,给一一种很不好的用户体验,有没有一种可以让RAGFlow加速的呢?进入RAGFlow的docker目录下会有发现有很多docker的配置文件。方法一:选择docker-compose-gpu.yml这个来启动项目。两个方法选其一 ,就会让你的RAGFlow的使用起来非常的丝滑!方法二:在docker-compose.yml末尾加上。

Ven%的博客 3156

【Spring】核心机制:IOC与DI深度解析

哈喽大家好吖,今天来给大家介绍Spring IOC与DI的相关知识点,这些是Spring中非常核心且关键的概念,那么废话不多说让我们开始吧。

2301_81073317的博客 1320

学Simulink——基于高渗透率可再生能源微电网的逆变器系统场景实例:含高比例逆变型电源的微电网暂态稳定性分析

本文详细介绍了基于MATLAB/Simulink的高渗透率可再生能源微电网建模方法,重点分析含高比例逆变型电源的微电网暂态稳定性问题。通过构建包含光伏、风电、逆变器和电网等模块的系统模型,展示了从项目创建、模块搭建到控制策略实现的完整过程。文章特别提供了逆变器PQ控制算法和故障处理逻辑的代码示例,并介绍了仿真参数设置与结果分析方法。该模型能有效评估微电网在故障条件下的动态响应特性,为优化逆变器控制策略提供依据,对现代智能电网研究具有重要意义。

xiaoheshang_123的博客 140

【Spring】面试突击系列(一):IoC 与 DI 深度解析

Spring IoC与DI核心概念解析 摘要 本文深入解析Spring框架中IoC(控制反转)和DI(依赖注入)的核心概念。IoC是一种设计思想,将对象创建和依赖管理从代码转移到容器,实现解耦。DI有三种主要注入方式:构造器注入(Spring推荐)、Setter注入和字段注入(不推荐),各有优缺点。文章对比了@Autowired和@Resource注解的差异,前者是Spring原生按类型注入,后者是Java标准按名称注入。此外还介绍了Bean的6种作用域(singleton/prototype等)和生命周期

zzz_2368的博客 562

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring核心揭秘:IOC与DI的深度解析

本文深入解析Spring框架中的控制反转(IOC)与依赖注入(DI)机制。IOC是一种将对象创建和管理权转移给容器的设计思想,DI则是其具体实现方式。文章首先阐明两者的核心定义与区别,指出IOC通过"控制权转移"颠覆传统开发模式,DI则实现自动依赖注入。其次分析IOC与DI的核心价值:降低耦合度、简化对象管理、便于测试。接着详细介绍Spring容器的两种类型(BeanFactory与ApplicationContext)及Bean的生命周期管理。最后系统讲解三种依赖注入方式(构造器注入、

小罗的博客 1036

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Core深度解析:IoC与DI如何让你的代码像奶茶一样丝滑?

解耦神器:通过IoC/DI实现组件松耦合效率工具:自动管理对象生命周期扩展基石:为AOP、事务等高级特性打下基础你的项目中有没有被Spring Core拯救过的场景?欢迎评论区分享!(建议结合Spring官方文档实践,本文代码适用于学习交流)

程序猿小白菜 1108

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Spring 基于注解的 IOC (DI) 深度解析

在Spring中,我们可以使用注解来实现基于注解的IoC和DI,从而简化配置和提高开发效率。本文将深入探讨Spring中基于注解的IoC和DI的原理及实践。本文深入探讨了Spring中基于注解的IoC和DI的原理及实践。通过了解注解的概念、原理以及在实际项目中的应用方式,我们可以更好地利用Spring框架简化应用程序的配置和管理过程。在实际项目中,我们可以根据需要选择合适的注解和配置方式,提高开发效率和程序的可维护性。希望本文能帮助读者更好地理解和掌握Spring中基于注解的IoC和DI技术。

weixin_52721608的博客 378

Spring框架IOC与DI机制深度解析

控制反转(IOC)和依赖注入(DI)是Spring框架的核心设计思想,也是现代Java开发的基础概念。IOC容器通过接管对象生命周期管理,实现了组件间的解耦,而DI则具体实现了这种控制权的转移。从技术原理看,Spring通过BeanFactory和ApplicationContext等容器实现,支持构造器注入、Setter注入等多种依赖注入方式。这种机制在微服务架构和云原生应用中尤为重要,能显著提升代码的可测试性和可维护性。实际开发中,合理运用IOC容器和DI技术,可以优化企业级应用的架构设计,特别是在处理

weixin_33404102的博客 162

Spring IoC与DI机制深度解析及最佳实践

控制反转(IoC)和依赖注入(DI)是现代Java开发的核心设计模式,通过将对象创建和依赖管理的控制权从代码转移到容器,实现了组件间的松耦合。Spring框架作为Java生态中最主流的IoC容器实现,其核心机制包括Bean生命周期管理、自动装配和配置集中化。从技术原理看,Spring通过BeanFactory和ApplicationContext两大容器接口,支持XML配置、注解驱动等多种配置方式,并提供了构造器注入、Setter注入等灵活的依赖注入模式。在实际工程应用中,这些特性显著提升了代码的可测试性和

weixin_33806859的博客 314
上一篇: Spring框架核心技术与原理解析
下一篇: Spring框架核心技术与原理解析
Java廖志伟
博客等级 码龄2年 3609粉丝 1517原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值