什么是Spring
Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以
IoC(nverse Of Control:反转控制) 和
AOP(Aspect Oriented Programming:面向切面编程)
为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的 Java EE 企业应用开源框架
简化java开发
为了降低Java开发的复杂性,Spring采用了以下4种关键策略
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
在这里,我们只需要有一个Spring能简化java开发的概念,在接下来的文章中我们会具体感受为什么会简化开发
程序耦合:
现在有Knight
和Quest
骑士和探险两个接口,RescueQuest实现了Quest接口,它只能进行拯救任务
public class BraveKnight implements Knight{
private RescueQuest quest;
public BraveKnight (){
this.quest = new RescueQuest ();
}
public void actionOnQuest(){
quest.action();
}
}
可以看到,BraveKnight
在它的构造函数中自行创建了RescueQuest
对象,这使得这两个对象高度耦合,而且这个骑士类的功能也受到限制,只能执行拯救任务,如果有其他探险比如杀掉一条龙这里不能完成,更糟糕的是在单元测试中必须当保证骑士的actionOnQuest()
被调用的时候,探险类的action()
也要被执行,这将导致代码难以测试,难以复用,一个地方出现Bug,将会导致更多地方出现bug
如何解耦
通过工厂模式解耦:
在传统的获取对象的方式是通过new来获取对象,是主动的获取
现在我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。
这种被动接收的方式获取对象的思想就是控制反转,它是 spring 框架的核心之一,那么什么是控制反转呢:
控制反转(Inversion of Control简写为IoC)
概念:
- 控制反转(Inversion of Control简写为IoC,把对象的创建交给框架,它包括依赖注入和依赖查找,它的作用是降低程序间的耦合(依赖关系)
依赖注入:
**依赖注入(Dependency Injection,简称DI)**它的作用就是让对象之间保持松散耦合,具体实现由spring容器提供,在传统开发中:一个类中包含其他类的对象,比如BraveKnight
类中的RescueQuest
对象,骑士依赖探险,它们之间的关系被称为依赖关系,BraveKnight
负责管理与自己相互协作的对象的引用RescueQuest quest
,这会导致程序的高度耦合
我们知道了可以通过工厂模式机型解耦,在Spring中,对象的依赖关系通过依赖注入(DI)由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,这里的第三方组件就是我们所说的工厂,在spring中的体现为Spring容器,
如图所示,依赖注入会将所依赖的关系自动交给目标对象,而不是让对象自己去获取依赖,依赖关系将被自动注入到他们的对象中去
下面我们通过一个案例来了解一下具体的执行过程:
/**
*探险类接口
*/
public interface Quest {
public void action();
}
/*
*骑士接口
*/
public interface Knight { }
/**
* 骑士类
*/
public class BraveKnight implements Knight {
private Quest quest;
public BraveKnight(Quest quest) {
this.quest = quest;
}
public void actionOnQuest(){
quest.action();
}
}
/**
*探险类
*/
public class RescueQuest implements Quest {
public void action() {
System.out.println("执行拯救任务");
}
}
我们改动了BraveKnight的结构,将quest的实现通过构造器的方式实现注入,只要实现了Quest接口都可以传进来,这就保证了骑士可以完成不同的探险任务
除了XML进行配置还可以基于java的配置,在这里不予演示
通过上述代码我们就可以回答之前的问题:为什么会简化开发,
spring还有其他简化开发的方式,这里只介绍了IoC依赖注入来展示
Spring的体系结构:
让我们分别浏览这些模块
- Spring核心容器
容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建,配置和管理,在该模块中包括了Spring bean工厂,它为Spring提供了DI功能,基于bean工厂我们还会发现有多种Spring上下文实现的方式,每一种都提供了配置Spring的不同方式 - SpringAOP模块
面向切面编程 - 数据访问与集成
有不同的方式实现,可以是Spring Data JPA或Mybatis或其他ORM,也可以是Spring中的JDBC模板 - Web与远程调用
MVC模式是一种被普遍接受的构建web应用的方法,如当前流行的springmvc框架
当我们具体的开发一个企业级Java应用时,这些模块都会提供我们所需要的一切,我们只需要在pom文件中导入需要的坐标即可,我们可以根据需求自主搭配相应的模块而不是将整个应用完全建立在Spring框架之上,比如数据访问与集成,可以用Spring来整合其他的框架比如Mybatis而不是Spring提供的Spring Data了