我们之前学习了Servlet
,大体了解了服务器端代码的开发流程,Servlet可以理解为是一种框架,但Servlet使用起来有很多的不方便,每次需要自己配置Tomcat,不能快速的引入依赖和添加jar包等,所以现在主流的框架不使用Sevlet,而使用Spring.
什么是Spring?
Spring指的是Spring Framework
(Spring 框架),它是一个开源框架,有非常活跃和庞大的社区支持,Spring支持广泛的应用场景,可以让Java企业级开发更简单。
用一句话概括Spring:Spring是包含众多工具方法的IoC容器。
Spring框架中有很多模块,如Spring JDBC 、Spring MVC 、Spring Security、 Spring AOP 、Spring ORM 、Spring Test等其他模块,通过使用这些模块可以大幅度的提升开发效率。
现在使用较多的、比较新的框架是Spring Boot
.SpringBoot是Spring的进阶和扩展,Spring是SpringBoot的基础。
上面讲到Spring是一种容器,那什么是容器呢?
什么是容器?
容器就是用来容纳某种东西的基本装置。
之前 我们已经接触过一些容器,比如
List/Map
—数据储存容器
Tomcat
–web容器
我们这里学习的Spring也是一个容器,而且是一个IoC
容器
什么是IoC?
IoC=inversion of Control
(控制反转),这是一种设计思想,并不是具体的技术。控制反转即将我们设计好的对象交给容器控制,而不是由我们直接控制。这种控制和管理对象的容器也就是IoC容器。
举例,比如我们创建一个构建“汽车”的程序,需要有一个Car类,然后在Car类中创建车身Framework,在底盘中创建底盘Bottom,在底盘中创建轮胎Tire类。通常情况下,我们都是这种设计思想,类与类之间进行调用。
public class NewCarExample {
public static void main(String[] args) {
Car car = new Car();
car.init();
}
/**
* 汽车对象
*/
static class Car {
public void init() {
// 依赖车身
Framework framework = new Framework();
framework.init();
}
}
/**
* 车身类
*/
static class Framework {
public void init() {
// 依赖底盘
Bottom bottom = new Bottom();
bottom.init();
}
}
/**
* 底盘类
*/
static class Bottom {
public void init() {
// 依赖轮胎
Tire tire = new Tire();
tire.init();
}
}
/**
* 轮胎类
*/
static class Tire {
// 尺寸
private int size = 30;
public void init() {
System.out.println("轮胎尺寸:" + size);
}
}
}
这种设计的缺陷就是,如果我们想要获得不同尺寸的轮胎,不仅需要修改底层的轮胎类,还需要修改整个调用链上的类,这非常的不方便。为了避免这种情况,我们采用IoC的设计思想,不在类中创建需要使用的类,而是直接注入。
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;
}
public void run() {
framework.init();
}
}
static class Framework {
private Bottom bottom;
public Framework(Bottom bottom) {
this.bottom = bottom;
}
public void init() {
bottom.init();
}
}
static class Bottom {
private Tire tire;
public Bottom(Tire tire) {
this.tire = tire;
}
public void init() {
tire.init();
}
}
static class Tire {
private int size;
public Tire(int size) {
this.size = size;
}
public void init() {
System.out.println("轮胎:" + size);
}
}
}
这样就发生了反转,我们先创建轮胎类,然后将其注入给底盘,底盘注入给车身类,车身注入给Car,如果轮胎的大小发生改变,我们只需要改变底层的轮胎类,而不需要再修改整个调用链,这种思想就是IoC
。
IoC的设计思想有什么作用?
IoC的设计思想可以降低代码之间的耦合性,也就是代码之间的关联程度,进而设计出松耦合、更优良的代码。传统的程序设计都是我们在类中主动创建依赖对象,进而使用这个对象的一些资源,这就导致了类与类之间高耦合,难于测试。在IoC的设计思想下,我们将创建和管理对象的权限交给容器,由容器进行注入和组合对象,所以对象和对象之间、类和类之间是松散耦合、便于功能复用,也方便测试,也会将我们的代码结构体系变得非常灵活。
什么是DI?
DI:Dependency Injection
,依赖注入。
依赖注入是IoC
设计思想的具体实现手段,具体实现技术.
即由IoC容器动态的将某个依赖关系注入到某个组件之中。就比如类A需要连接数据库,通常情况下我们是创建一个Connection对象,而依赖注入就是不需要我们创建,我们直接告诉容器 ,类A需要一个Connection对象,容器就会在程序运行的过程中,动态的将这个Conection对象给注入到类A中,这个对象是何时创建、何时销毁都不由我们决定,而是由容器自行决定。
DI的实现其实依赖了Java的一个重要特性:反射(reflection)。它允许程序在运行的时候动态的生成对象、执行对象的方法、修改对象的属性。
依赖注入可以提升组件运行的效率,为系统搭建一个灵活的、可扩展的平台。
IoC vs DI?
IoC是控制反转,它是一种设计思想,而DI是依赖注入,是控制反转的实现手段。
Spring最核心的功能?
Spring最核心的功能就是管理对象,动态的将对象注入Spring框架当中,然后再给取出来。