spring学习笔记(1)IOC核心原理解析

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: <div class="markdown_views"><p><strong>Ioc</strong>—Inversion of Control,即“控制反转”。在传统面向对象编程中,我们往往会在客户类里主动去创建、配置我们需要用到的依赖。比如,我们有一个客户类userDao需要完成数据库的增删改查操作,我们需要先在客户类对象中创建我们需要的依赖(数据库连接对象conn):<

Ioc—Inversion of Control,即“控制反转”。在传统面向对象编程中,我们往往会在客户类里主动去创建、配置我们需要用到的依赖。比如,我们有一个客户类userDao需要完成数据库的增删改查操作,我们需要先在客户类对象中创建我们需要的依赖(数据库连接对象conn):

    Class.forName("com.mysql.jdbc.Driver"); //加载mysql驱动
    url = "jdbc:myqsl://localhost/database";
   user = "root";
   password = "root";
   conn = DriverManager.getConnection(url,user,password);
   ....
   ....
   conn.close();

从上面我们可以看到,数据库连接对象的参数配置、初始化以及最终的销毁,都是在我们客户类的控制下完成的,这显然会造成两个类的严重耦合,如果有新的需求,需要去更改数据库的参数配置,或者数据库的连接方式等,我都要去修改我们的客户类userDao,但它所完成的功能没有变化(依然是对数据库的增删改查操作)。
事实上,一个良好的设计,核心原则之一就是将变化隔离,使得变化部分发生变化时,不变部分不受影响。对此,我们往往利用面向对象的多态性,使客户类不再直接依赖服务类,而是依赖于一个抽象的接口,这样,客户类就不能在内部直接实例化具体的服务类。但是,客户类在运作中又客观需要具体的服务类提供服务,因为接口是不能实例化去提供服务的。于是就产生了“客户类不准实例化具体服务类”——“客户类需要具体服务类”的矛盾。
于是IOC容器就出现了,我们可以把客户类所需要的依赖(dataSource),交给容器进行管理(在spring中,容器的配置往往在xml文件中写入)。

     <bean id="dataSource"  
        class="org.apache.commons.dbcp.BasicDataSource">  
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>  
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>  
        <property name="username" value="root"/>  
        <property name="password" value="test"/>  
    </bean>  

这样,客户类只需要定义一个注入点,在需要用到依赖的时候,由IOC容器注入进来

    public void setDataSource(DataSource dataSource){  
        this.dataSource = dataSource;  
    }  

使用完毕后,只需交还给IOC容器进行销毁。也就是说,客户类(userDao)只专注于自己的职责(对数据库的增删改查),依赖(数据库连接对象)的参数配置、初始化、销毁工作统统交给IOC容器管理。这样,面对新的需求,无论我们如何更改依赖(如更换数据库等),只要我们的客户类需求不变(userDao依然专注于对数据库的增删改查操作),我们就无须对客户类作任何变更。
这就是IOC的核心思想。本来,是由客户类来控制依赖的生命周期,主动创建获取依赖,现在依赖由容器创建,客户类需要用到依赖的时候被动注入来获取,即依赖的获取方式反转了。
很多时候,我们往往会听到另一个概念DI—Dependency Injection,即“依赖注入”。它的本质和IOC其实是一样。通过依赖注入,我们只需要通过简单地配置(如上面的xml文件配置),客户类即可轻松获得它所需要的资源,来完成自身的业务逻辑,而无需关心这些资源从哪里来,到哪里去。

目录
相关文章
|
3天前
|
监控 安全 Java
Spring cloud原理详解
Spring cloud原理详解
14 0
|
3天前
|
XML JavaScript 数据格式
Beautiful Soup 库的工作原理基于解析器和 DOM(文档对象模型)树的概念
Beautiful Soup 使用解析器(如 html.parser, lxml, html5lib)解析HTML/XML文档,构建DOM树。它提供方法查询和操作DOM,如find(), find_all()查找元素,get_text(), get()提取信息。还能修改DOM,添加、修改或删除元素,并通过prettify()输出格式化字符串。它是处理网页数据的利器,尤其在处理不规则结构时。
7 2
|
5天前
|
存储 前端开发 Java
Spring Boot自动装配的源码学习
【4月更文挑战第8天】Spring Boot自动装配是其核心机制之一,其设计目标是在应用程序启动时,自动配置所需的各种组件,使得应用程序的开发和部署变得更加简单和高效。下面是关于Spring Boot自动装配的源码学习知识点及实战。
13 1
|
5天前
|
机器学习/深度学习 人工智能 数据可视化
号称能打败MLP的KAN到底行不行?数学核心原理全面解析
Kolmogorov-Arnold Networks (KANs) 是一种新型神经网络架构,挑战了多层感知器(mlp)的基础,通过在权重而非节点上使用可学习的激活函数(如b样条),提高了准确性和可解释性。KANs利用Kolmogorov-Arnold表示定理,将复杂函数分解为简单函数的组合,简化了神经网络的近似过程。与mlp相比,KAN在参数量较少的情况下能达到类似或更好的性能,并能直观地可视化,增强了模型的可解释性。尽管仍需更多研究验证其优势,KAN为深度学习领域带来了新的思路。
63 5
|
6天前
|
敏捷开发 测试技术 持续交付
极限编程(XP)原理与技巧:深入解析与实践
【5月更文挑战第8天】极限编程(XP)是一种敏捷开发方法,注重快速反馈、迭代开发和简单设计,以提高软件质量和项目灵活性。关键原则包括客户合作、集体代码所有权、持续集成等。实践中,使用故事卡片描述需求,遵循编程约定,实行TDD,持续重构,结对编程,并定期举行迭代会议。通过理解和应用XP,团队能提升效率,应对变化。
|
7天前
|
缓存 自然语言处理 JavaScript
万字长文深度解析JDK序列化原理及Fury高度兼容的极致性能实现
Fury是一个基于JIT动态编译的高性能多语言原生序列化框架,支持Java/Python/Golang/C++/JavaScript等语言,提供全自动的对象多语言/跨语言序列化能力,以及相比于别的框架最高20~200倍的性能。
|
9天前
|
Java 开发者 微服务
Spring Cloud原理详解
【5月更文挑战第4天】Spring Cloud是Spring生态系统中的微服务框架,包含配置管理、服务发现、断路器、API网关等工具,简化分布式系统开发。核心组件如Eureka(服务发现)、Config Server(配置中心)、Ribbon(负载均衡)、Hystrix(断路器)、Zuul(API网关)等。本文讨论了Spring Cloud的基本概念、核心组件、常见问题及解决策略,并提供代码示例,帮助开发者更好地理解和实践微服务架构。此外,还涵盖了服务通信方式、安全性、性能优化、自动化部署、服务网格和无服务器架构的融合等话题,揭示了微服务架构的未来趋势。
32 6
|
13天前
|
存储 芯片
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P11】(第十一章:15题速过串行口的工作原理和应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
【期末不挂科-单片机考前速过系列P10】(第十章:11题中断系统的工作原理及应用)经典例题盘点(带图解析)
|
13天前
|
C语言 C++
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)
【期末不挂科-单片机考前速过系列P1】(第一章:27题搞定单片机&其工作原理)经典例题盘点【选择题&判断题&填空题】(带图解析)

推荐镜像

更多