目录
1.1jdk环境依赖
1.2 Spring介绍
1.3 Spring历史
1.4 设计理念
1.1 jdk环境依赖
从Spring Framework 5.1开始,Spring需要JDK 8+ (Java SE 8+),并提供对JDK 11 LTS的开箱即用支持。建议将Java SE 8 update 60作为Java 8的最低补丁版本,但通常建议使用最新的补丁版本。
1.2 Spring介绍
Spring分为许多模块,应用可以选择他们所需要的模块。Spring的核心模块是core container(核心容器),It including a configuration model and a dependency injection mechanism。除此之外,Spring框架还为不同的应用程序体系结构提供基础支持,包括消息传递、事务数据和持久性以及web
1.3 Spring历史
创建Spring的主要目的是用来替代更加重量级的Java企业级技术,尤其是EJB(Enterprise JavaBean )Spring框架通过以下规范,简化了早期J2EE规范的复杂性。
Servlet API (JSR 340)
WebSocket API (JSR 356)
Concurrency Utilities (JSR 236)
JSON Binding API (JSR 367)
Bean Validation (JSR 303)
JPA (JSR 338)
JMS (JSR 914)
as well as JTA/JCA setups for transaction coordination, if necessary.
the Dependency Injection (JSR 330) and Common Annotations (JSR 250)
1.4 设计理念
学习框架时,不仅仅需要知道它是怎么使用和怎么做的,更需要了解它遵循的原则。
Spring最根本的使命:简化Java开发。
这是一个郑重的承诺。许多框架都声称在某些方面做了简化,但Spring的目标是致力于全方位的简化Java开发。
Spring是如何简化Java开发的?
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
1.基于POJO的轻量级和最小侵入性编程;
很多框架(如Struts)通过强迫应用继承它们的类或实现它们的接口从而导致应用与框架绑死,
Spring不会强迫你实现接口或继承类,相反,在基于Spring构建的应用中,它的类通常没有任何痕迹表明你使用了Spring。最坏的场景是,一个类或许会使用Spring注解,但它依旧是POJO。
尽管形式看起来很简单,但POJO一样可以具有魔力。Spring赋予POJO魔力的方式之一就是通过DI来装配它们
2.通过依赖注入和面向接口实现松耦合;
在项目中应用DI(Dependency Injection),代码会变得异常简单并且更容易理解和测试。
任何一个有实际意义的应用都会由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这将会导致高度耦合和难以测试的代码。
package com.Spring.Knight;
public class DamselResuingKnight implements Knight{
private ResumDamselQuest quest;
public DameslResuingKnight() {
// RescueDamselQuest与DameslResuingKnight相耦合,骑士不能再执行其它任务
// 骑士只能执行拯救落难公主,不能执行像屠杀恶龙等任务。
this.qeust = new RescueDamselQuest();
}
public void emabrakOnQuest() {
// 对这个类进行单元测试,也会变得异常麻烦,必须保证emabrakOnQuest()被调用时
// 传入对象的embaek()也被调用
quest.embaek();
}
}
耦合具有两面性:
一方面,紧密耦合的代码难以测试、难以复用、难以理解,并且典型地表现出“打地鼠”式的bug特性(修复一个bug,将会出现一个或者更多新的bug)。
另一方面,一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。
总而言之,耦合是必须的,但应当被小心谨慎地管理。
通过DI,依赖的对象将由第三方组件(Spring IOC 容器)创建对象的时候提供。依赖对象无需自行创建管理,如图1.1所示,依赖对象将被自动注入到需要它们的对象当中。
图1.1 依赖注入会将所依赖的对象自动交给目标对象,而不是让对象自己去获取。
package com.Spring.Knight;
public class DamselResuingKnight implements Knight{
private ResumDamselQuest quest;
public DameslResuingKnight(Quest quest) {
// 对象不用自己再去获取所需要的依赖,由第三方组件所提供。
// 骑士也因此可以执行多种任务
this.qeust = quest;
}
public void emabrakOnQuest() {
quest.embaek();
}
}
这就是DI所带来的最大收益:
如果一个对象只通过接口来表明依赖关系,
那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换
3.基于切面和惯例进行声明式编程;
4.通过切面和模板减少样板式代码;