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

简介: <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文件配置),客户类即可轻松获得它所需要的资源,来完成自身的业务逻辑,而无需关心这些资源从哪里来,到哪里去。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
XML Java 数据库
Spring学习(十二):声明式事务管理(完全响应式)
Spring学习(十二):声明式事务管理(完全响应式)
|
7月前
|
Java 数据库 Spring
Spring学习(十一):声明式事务管理(响应式)
什么是事务:事务是数据库操作的最基本单元,逻辑上一组操作,要么都成功,如果有一个失败则意味着所有操作都失败
Spring学习(十一):声明式事务管理(响应式)
|
8月前
|
XML Java 数据库连接
|
8月前
|
XML Java 数据库连接
Spring-全面详解(学习总结---从入门到深化)(中)
注解配置和xml配置对于Spring的IOC要实现的功能都是一样的,只是配置的形式不一样。
117 1
Spring-全面详解(学习总结---从入门到深化)(中)
|
8月前
|
XML Java 应用服务中间件
Spring-全面详解(学习总结---从入门到深化)(上)
Spring是一个开源框架,为简化企业级开发而生。它以IOC(控制 反转)和AOP(面向切面)为思想内核,提供了控制层 SpringMVC、数据层SpringData、服务层事务管理等众多技术,并 可以整合众多第三方框架。
186 0
Spring-全面详解(学习总结---从入门到深化)(上)
|
8月前
|
安全 前端开发 Java
Spring Security-全面详解(学习总结---从入门到深化)(下)
我们也可以自定义退出成功处理器,在退出后清理一些数据
240 0
Spring Security-全面详解(学习总结---从入门到深化)(下)
|
8月前
|
安全 前端开发 Java
Spring Security-全面详解(学习总结---从入门到深化)(上)
Spring Security是Spring项目组提供的安全服务框架,核心功能包 括认证和授权。它为系统提供了声明式安全访问控制功能,减少了 为系统安全而编写大量重复代码的工作。
2110 2
Spring Security-全面详解(学习总结---从入门到深化)(上)
|
9月前
|
安全 Java 应用服务中间件
Spring Boot学习第二天
Spring Boot学习第二天
75 0
Spring Boot学习第二天
|
9月前
|
开发框架 前端开发 Java
Spring Boot学习第一天
Spring Boot学习第一天
115 0
Spring Boot学习第一天
|
9月前
|
前端开发 JavaScript Java
【Spring Boot学习】一、使用Spring Initializer快速创建Spring Boot项目
【Spring Boot学习】一、使用Spring Initializer快速创建Spring Boot项目
479 1
【Spring Boot学习】一、使用Spring Initializer快速创建Spring Boot项目
推荐文章
更多