1.1 简介
2002 首次推出了Spring框架的雏形

spring理念:使现有的技术更加容易使用,本身是一个大杂烩,整合了现有框架。     SSH:Struts2,spring,hibernate
SSM:Spring,Spring MVC,Mybatis      官网:  https://spring.io/projects/spring-framework
官方下载地址:  https://repo.spring.io/release/org/springframework/spring/
github地址:    https://github.com/spring-projects/spring-framework
MVN官方:   https://mvnrepository.com/


所需要的依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.0.RELEASE</version>
</dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.0.RELEASE</version>
</dependency>

1.2 优点:
spring是一个开源的免费框架(容器)
spring是一个轻量级的,非入侵式的框架
什么是入侵式: 为了一个jar导进来,你原来项目不能用了,他的类把你原来的项目干掉了

控制反转(IOC)
面向切面编程(AOP)
支持事务的处理,对框架整合的支持。        总结一句话:   Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架

1.3 组成:

每个模块的作用如下:
**核心容器(Spring Core):**核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring 上下文(Spring Context):Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI(Java命名和目录接口)、EJB(Enterprise Java Beans称为Java 企业Bean)、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP。
1.4 扩展
在Spring官网有这个介绍,现代话的java开发,说白了就是基于Spring开发

Spring Boot: 一个快速开发的脚手架,基于Spring Boot可以快速开发单个微服务 Spring Cloud:   Spring Cloud是基于SpringBoot实现的    现在大多数公司都在使用SpringBoot进行快速开发,学习SpringBoot的前提,需要完全掌握
Spring及Spring MVC承上启下的作用    弊端:  发展了太久,违背了原来的理念。配置十分繁琐,人称“配置地狱”

2 IOC理论推导

1.UserDao接口
2.UserDaoImpl实现类
3.UserService业务接口
4.UserServiceImpl业务实现类
package src.com.lx.dao;/*** @author LongXi* @create 2021-05-24 21:27*/
public interface UserDao {void getUser();
}
/*** @author LongXi* @create 2021-05-24 21:30*/
public class UserDaoImpl implements UserDao{@Overridepublic void getUser() {System.out.println("默认获取用户的数据");}
}

/*** @author LongXi* @create 2021-05-24 21:31*/
public interface UserService {void getUser();
}
/*** @author LongXi* @create 2021-05-24 21:31*/
public interface UserService {void getUser();
}
/*** @author LongXi* @create 2021-05-24 21:34*/
public class MyTest {public static void main(String[] args) {//用户实际调用的是业务层,dao层他们不需要接触UserServiceIpml userServiceIpml = new UserServiceIpml();userServiceIpml.getUser();}
}

现在用户想用mysql获取数据,添加【UserDaoMySqlImpl 】实现类,实现【UserDao】接口

/*** @author LongXi* @create 2021-05-24 21:38*/
public class UserDaoMySqlImpl implements UserDao{@Overridepublic void getUser() {System.out.println("Mysql获取用户信息");}
}

我们想用Mysql获取用户信息,就必须改我们的【UserServiceIpml】实现类

/*** @author LongXi* @create 2021-05-24 21:32*/
public class UserServiceIpml implements UserService{//private UserDao userDao = new UserDaoImpl();private UserDao userDao = new UserDaoMySqlImpl();@Overridepublic void getUser() {userDao.getUser();}
}

测试结果


OK没问题,但是现在假如用户又想用Oracl实现类获取用户信息呢?我们又得改【UserServiceIpml】,很麻烦。
每一次因为用户的请求,我们要修改代码,做大量的改动,这是一个很优秀的程序吗?我们的程序适应不了用户的变更。
那么思考能不能解决这个问题呢?
我们让服务端代码不动,然后让客户端自己去改变调用的方式。

改修代码

public class UserServiceIpml implements UserService{//private UserDao userDao = new UserDaoImpl();//private UserDao userDao = new UserDaoMySqlImpl();private  UserDao userDao;//用set动态实现值的注入public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();}
}

测试类

/*** @author LongXi* @create 2021-05-24 21:34*/
public class MyTest {public static void main(String[] args) {//用户实际调用的是业务层,dao层他们不需要接触UserService userService = new UserServiceIpml();((UserServiceIpml)userService).setUserDao(new UserDaoMySqlImpl());userService.getUser();}
}

区别:
在之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改源代码。
如果程序代码量十分大,修改一次的成本十分昂贵。

现在:我们使用了一个Set接口实现,已经发生了革命性的变化。

  • 之前程序是主动创建对象,控制权在程序员手上
  • 使用了set注入后,程序不再具有主动性,而是变成了被动接受。

这种思想,从本质上解决了问题,我们程序员不用再去管理对象的创建了。系统的耦合性大大的降低了,可以更加的专注在业务的实现上。

这就是IOC的原型。


IOC本质:

所谓控制反转就是:获得依赖对象的方式反转了。




Spring-IOC推导相关推荐

  1. Spring IoC容器初始化源码(1)—容器初始化入口以及setConfigLocations设置容器配置信息【一万字】

      基于最新Spring 5.x,对于基于XML的Spring IoC容器初始化过程中的setConfigLocations设置容器配置信息方法的源码进行了详细分析,最后给出了比较详细的方法调用时序图 ...

  2. spring IOC创建对象方式

    spring IOC创建对象方式 通过无参构造来创建 验证方法: 创建实体类: public class User {private String name;public User() {System ...

  3. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  4. Spring IoC是如何进行依赖注入的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 依赖注入(DI) DI(Dependency Injection) ...

  5. 面试被问烂的 Spring IOC(求求你别再问了)

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! 作者:莫那·鲁道 链接:http://thinkinjava.cn 广义的 IOC IoC(Inv ...

  6. spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  7. 还不懂spring IOC核心原理?200行代码带你手撸一个

    Spring做为Java企业级应用的开源开发框架,早已成为Java后端开发事实上的行业标准,无数的公司选择Spring作为基础的开发框架. 使用Spring框架的人一定都听过Spring的IoC(控制 ...

  8. 头条一面:Spring IOC容器中只存放单例Bean吗?

    最近,很多小伙伴出去面试,感觉自己面的不是很理想,回来后,不少小伙伴把面试题做了记录发给我,让我给大家解析下,然后发出来.当我看到这些面试题时,快速在脑海中构建起了整个知识体系,从基础到框架.从分布式 ...

  9. 谈谈对Spring IOC的理解

    2019独角兽企业重金招聘Python工程师标准>>> 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人 ...

  10. Spring点滴一:Spring Ioc 容器

    Spring 容器: Spring 容器是Spring框架的核心.Spring容器将创建Bean对象实例,把它们联系在一起,配置它们,并管理它们整个生命周期从创建到销毁.Spring 容器通过依赖注入 ...

最新文章

  1. linux操作系统重启后 解决nginx的pid消失问题
  2. Java 最坑爹的 10 大功能点!
  3. python列表的内置方法_Python内置方法详解
  4. C# 连接MySQL错误给定关键字不在字典中”,下载最新mysql.dll文件即可
  5. Winform混合式开发框架的特点总结
  6. bcrypt的简单使用
  7. 【渝粤教育】国家开放大学2018年秋季 1317T社会工作行政(本) 参考试题
  8. 自动生成代码:TensorFlow官方工具TF-Coder已开源
  9. Vue插值文本换行问题
  10. soapUI(groovy脚本作用2)请不要问为什么系列2
  11. App_Code 目录
  12. android子线程为什么不能更新ui,Android非UI线程无法更新UI?
  13. 两平面平行但不重合的条件是_____怎样证明平行
  14. Android攻城狮 progressBarprogressDialog
  15. 在线视频插上“大数据翅膀”
  16. 对比两张excel的不同
  17. Server SQL 2008 练习
  18. thinkphp里分页类中前后台ulr不统一的问题
  19. Orange Business Services 携手俄罗斯劢龙时装集团打造虚拟试衣间 助其改善全球化生产制造模式...
  20. 计算机江苏省二级时间,江苏计算机二级考试时间(江苏计算机二级考试时间2020)...

热门文章

  1. ajax请求数据 ztree_ajax 异步获取数据填充到表格显示(ajax) 文档(Options API) DataTables中文网...
  2. c# xls 复制一行_编写干净的C#代码技巧
  3. python解析sql语句表名_python正则表达式匹配sql语句中的表名
  4. ArcGIS中Shapefile和Geodatabase坐标容差的问题
  5. Xformode的坑
  6. WriteableBitmap process summary
  7. MapReduce之RecordWriter理解
  8. (01)FPGA时序分析概念
  9. (99)FPGA ROM实现(V实现)
  10. (31)FPGA原语设计(IBUFG)