目录
[一、Spring、Spring MVC、Spring Boot的关系和区别](#一、Spring、Spring MVC、Spring Boot的关系和区别)
[1.2Spring MVC是什么?](#1.2Spring MVC是什么?)
[1.3Spring Boot是什么?](#1.3Spring Boot是什么?)
一、Spring、Spring MVC、Spring Boot的关系和区别
1.1Spring是什么?
Spring是一个开源框架,它让我们的开发更加简单。它支持广泛的应用场景,有着活跃而庞大的社区,这也是Spring能够长久不衰的原因。Spring是包含了众多工具方法的IoC容器。
主要功能:把对象交给Spring管理、从Spring中获取对象、管理对象、管理对象之间的依赖关系、面向切面编程(AOP)、数据库事务管理、数据访问、Web框架支持
Spring具备高度可开放性,并不强制依赖Spring,开发者可自由选择Spring的部分或者全部。Spring可以无缝集成第三方框架,比如数据访问框架(Hibernate、JPA)、Web框架(Struts、JSF)等。
1.2Spring MVC是什么?
Spring MVC是Spring的一个子框架。Spring诞生之后,大家觉得好用,于是按照MVC模式设计了一个MVC框架,主要用于开发Web应用和网络接口。所以Spring MVC是一个Web框架。
它基于Spring进行开发,天生与Spring框架集成。可以让我们更简洁地进行Web层开发,支持灵活地URL到页面控制器地映射,提供强大的"约定大于配置"的契约式编程支持,非常容易与其他框架集成。
1.3Spring Boot是什么?
Spring Boot式对Spring的一个封装,为了简化Spring应用的开发而出现。Spring Boot是个脚手架,插拔式搭建项目,可以快速集成其他框架进来。
比如想使用Spring Boot开发Web项目,只需引入Spring MVC框架即可,Web开发的工作式Spring MVC完成的,而不是Spring Boot 。想完成数据访问,只需要引入MyBatis框架即可。Spring Boot只是完成辅助简化项目开发的,让开发变得更加简单,甚至不需要额外的Web服务器,直接生成jar包执行即可。
1.4三者关系总结
Spring:核心框架,提供IoC、DI、AOP等
Spring MVC:基于Spring的Web框架
Spring Boot :基于Spring的快速开发整合包。
Spring MVC 和Spring Boot都属于Spring ,Spring MVC是基于Spring的一个MVC框架,而Spring Boot是基于Spring的一套快速开发整合包。
二、IoC入门:什么是容器、IoC、DI
2.1什么是容器?
像之前接触到的 List/Map-->数据存储容器、Tomcat-->Web容器、Spring-->IoC容器
2.2什么是IoC?
IoC:Inversion of Control(控制反转),Spring是一个"控制反转"的容器,就是获得依赖对象的过程被反转了。
当需要某个对象时,传统开发模式中需要自己通过new创建对象,现在不需要再进行创建,把创建对象的任务交给容器,程序只需要依赖注入。
2.3什么是DI?
DI:Dependency Injection(依赖注入)。
容器在运行期间,动态地为应用程序提供运行时所依赖地资源,称之为依赖注入。
程序运行时需要某个资源,此时容器就为其提供这个资源。
三、案例:用"造一辆车"理解传统开发与IoC
3.1传统程序开发
需求:造一辆车。设计:先造轮子,根据轮子大小设计底盘,根据底盘设计车身,最后根据车身设计整个汽车。
最后程序实现
java
public class NewCarExample {
public static void main(String[] args) {
Car car = new Car();
car.run();
}
/**
* 汽车对象
*/
static class Car {
private Framework framework;
public Car() {
framework = new Framework();
System.out.println("Car init....");
}
public void run() {
System.out.println("Car run....");
}
}
/**
* 车身类
*/
static class Framework {
private Bottom bottom;
public Framework() {
bottom = new Bottom();
System.out.println("Framework init....");
}
}
/**
* 底盘类
*/
static class Bottom {
private Tire tire;
public Bottom() {
this.tire = new Tire();
System.out.println("Bottom init....");
}
}
/**
* 轮胎类
*/
static class Tire {
// 尺寸
private int size;
public Tire() {
this.size = 17;
System.out.println("轮胎尺寸:" + size);
}
}
}
3.2问题分析
这样的设计可维护性很低,如果需要加工多种尺寸的轮胎
java
static class Tire {
// 尺寸
private int size;
public Tire(int size) {
this.size = size;
System.out.println("轮胎尺寸:" + size);
}
}
修改轮胎后,其他调用程序也会报错,都要修改,这样耦合度非常高。
3.3解决方案
在初始设计:根据轮子的尺寸设计底盘,轮子尺寸一改,底盘就得改,整个设计都得改。
那么换个设计思路:先设计车子大概样子,然后逐步向下,这时候就是轮子依赖底盘,底盘依赖车身,车身依赖汽车。
java
public class IocCarExample {
public static void main(String[] args) {
Tire tire = new Tire(20);
Bottom bottom = new Bottom(tire);
Framework framework = new Framework(bottom);
Car car = new Car(framework);
car.run();
}
static class Car {
private Framework framework;
public Car(Framework framework) {
this.framework = framework;
System.out.println("Car init....");
}
public void run() {
System.out.println("Car run...");
}
}
static class Framework {
private Bottom bottom;
public Framework(Bottom bottom) {
this.bottom = bottom;
System.out.println("Framework init...");
}
}
static class Bottom {
private Tire tire;
public Bottom(Tire tire) {
this.tire = tire;
System.out.println("Bottom init...");
}
}
static class Tire {
private int size;
public Tire(int size) {
this.size = size;
System.out.println("轮胎尺寸:" + size);
}
}
}
3.4IoC优势
在传统代码中对象创建顺序是:Car → Framework → Bottom → Tire
改进之后:Tire → Bottom → Framework → Car
传统代码是 Car 控制并创建了 Framework,Framework 创建了 Bottom,依次往下。而改进之后的控制权发生了反转,不再是使用方对象创建并控制依赖对象了,而是把依赖对象注入到当前对象中,依赖对象的控制权不再由当前类控制了。
这样的话,即使依赖类发生任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。
IoC具备以下优点:
资源不由使用资源的双方管理,而是由不使用资源的第三方管理
资源集中管理,实现资源的可配置和易管理。
降低了使用资源双方的依赖程度,也就是耦合度