第0步: Spring简介

什么是Spring?

有的人可能会说Spring是一个依赖注入的框架。

那么什么是依赖注入?

什么是依赖注入?

那么,我们又有了新的问题。

什么是依赖

我们来看一下,一般的Web应用程序结构。

web-di

如果我们想在显示一个网页或者想要保存某些数据的时候,我们会先调用业务逻辑层进行处理, 如果在涉及到数据的时候,业务逻辑层就会调用数据层,对数据进行存取。
这就是我们一般开发Web应用程序的一个基本的结构。
也就是Web层依赖于业务逻辑层,而业务逻辑层依赖于数据层。

我们来看一个具体的例子。

假设我们在编写一个业务,里面有许多复杂的业务逻辑。

其中一件事就是对一组数字进行排序。

public class BusinessService{
	SortAlgorithm sortAlgorithm;
}

在上面的类里,SortAlgorithm是BusinessService的一个依赖。 依赖的概念还是很简单的, 对于大型应用程序来说,可能会有千上万的类,每个类可能依赖不同层中的不同类。

因此,在一般的应用程序中,将会拥有很多的类,并且每个类可能还可能依赖其他的多个类。

那么我们来看一下,没有Spring之前,是怎么做的呢?

// BusinessService.java
public class BusinessService{
	SortAlgorithm sortAlgorithm = new BubbleSortAlgorithm();
}
//BubbleSortAlgorithm.java
public class BubbleSortAlgorithm implements SortAlgorithm{

}

因为我们业务需要排序算法。我们就定义了一个冒泡排序的类,然后直接BusinessService里实例化依赖的排序算法为冒泡排序。

想一下,上面的代码有什么问题?

如果希望业务使用不同的排序算法,该怎么办?
每当使用新的排序算法的时候,我们都需要修改代码。 这种直接实例化依赖的依赖性,我们为紧耦合。
业务服务与泡沫排序算法紧密结合。

假设我们希望这个业务服务使用快速排序算法。

我们可能需要这样修改代码。

// BusinessService.java
public class BusinessService{
	 SortAlgorithm sortAlgorithm; //  = new BubbleSortAlgorithm(); 
   public BusinessService(SortAlgorithm sortAlgorithm){
    	this.sortAlgorithm = sortAlgorithm;
  }
}

然后就可以这样写

SortAlgorithm sortAlgorithm = new  BubbleSortAlgorithm();
BusinessService businessServic = new BusinessService(sortAlgorithm);

上面的代码,实例化了对象并例化对象的依赖项。

有了Spring之后,Spring就可以帮我们完成上面的代码。我们就不需要自己手动的去写了。

但是,你可能会有一些疑问。

  • Spring是如何知道SortAlgorithm是使用BubbleSortAlgorithm来创建实例的。
  • Spring是如何知道创建BusinessService实例,并创建其依赖项。

我们在接下的几步会学到,这里就不展开了。