在这里插入图片描述

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主

写在前面

在Java近20年的历史中,它经历过很好的时代,也经历过饱受诟病的时代。尽管有很多粗糙的地方,如apet、企业级Javaean (EnterpriselavaBean,EB)、.ava数据对象 (ava Daa Obiect,JDO) 以及无数的日志框架,但是作为一个平,ava的历史是主富多彩的,有很的企业级软件都是基于这个平台构建的。Spring是Java历史中很重要的组成部分。

在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于EJB来说,Soring提供了更加轻量级和简单的编程模型。它增强了简单老式Java对象 (Plain Old Java obiect,POJO) 的功能,使其具备了之前只有EJB和其他企业级Java规范才具有的功能。

浦着时间的推移,EJB以及Java 2企业版 (Java 2 Enterprise Edition,J2EE) 在不断演化。EJB自身也提供了面向简单POJO的编程模型。现在,EJB也采用了依赖注入 (Dependencylnjection,DI)和面向切面编程 (Aspect-Oriented Programming,AOP)的理念,这毫无疑问是受到Spring成功的启发。

尽管J2EE(现在称之为JEE)能够赶上Spring的步伐,但Spring也没有停止前进。pring继续在其他领域发展,而JEE则刚刚开始涉及这些领域,或者还完全没有开始在这些领域的创新。移动开发、社交AP集成、NOSQL数据库、云计算以及大数据都是Spring正在涉足和创新的领域。Spring的前景依然会很美好。

1、为什么要有 Spring

Spring是一个开源的Java框架,它旨在简化企业级应用程序的开发。Spring提供了一系列的功能和工具,可以帮助开发者构建可扩展、灵活和高效的应用程序。

首先,Spring框架提供了依赖注入(Dependency Injection)功能,使得对象之间的依赖关系可以通过配置文件或注解来管理,而不是硬编码在代码中。这样可以降低代码的耦合度,提高代码的可维护性和可测试性。

其次,Spring框架还提供了面向切面编程(Aspect-Oriented Programming)的支持。通过使用切面,开发者可以将与业务逻辑无关的功能(如日志记录、事务管理等)从主要的业务逻辑中分离出来,提高代码的模块化程度。

此外,Spring框架还提供了对持久化框架的集成支持,如Hibernate、MyBatis等。开发者可以通过Spring框架来管理数据库连接、事务等,简化了数据库操作的代码。 Spring还提供了一套全面的Web开发框架,称为Spring MVC。Spring MVC基于MVC(Model-View-Controller)模式,提供了一种结构清晰、灵活可扩展的方式来开发Web应用程序。

另外,Spring框架还支持各种其他功能,如安全认证、缓存管理、消息队列等。它的模块化设计使得开发者可以根据自己的需求选择使用特定的模块,而不需要引入整个框架。 总之,Spring框架为Java开发者提供了一种简化企业级应用程序开发的方式,通过提供丰富的功能和工具,帮助开发者提高开发效率、降低代码复杂度,并且提供了良好的可维护性和可扩展性。

2、Spring 的目标

Spring的目标是致力于全方位的简化Java开发。

2.1、Spring是如何简化Java开发的?

为了降低Java开发的复杂性,Spring采取了以下4种关键策略:

  • 基于POJO的轻量级和最小侵入性编程
  • 通过依赖注入和面向接口实现松耦合
  • 基于切面和惯例进行声明式编程
  • 通过切面和模板减少样板式代码

几乎Spring所做的任何事情都可以追溯到上述的一条或多条策略。在本章的其他部分,我将通过具体的案例进一步阐述这些理念,以此来证明Spring是如何完美兑现它的承诺的,也就是简化Java开发。让我们先从基于POJO的最小侵入性编程开始。

2.2、什么是 POJO

POJO是"Plain Old Java Object"的缩写,意为"普通的旧Java对象"。它是一个简单的Java对象,没有任何特殊限制或要求。POJO通常是指没有继承特定类、实现特定接口或依赖特定框架的普通Java对象。

POJO的设计理念是简单、可重用和可测试的对象。它遵循面向对象的原则,将数据和行为封装在一个对象中,通过getter和setter方法来访问和修改对象的属性。

POJO的特点包括:

  1. 简单性:POJO不依赖于特定的框架或技术,它只是一个普通的Java类。
  2. 可重用性:POJO可以在不同的应用程序中被重复使用,因为它们没有特定的依赖或限制。
  3. 可测试性:POJO的简单性使得它们易于进行单元测试,可以独立地测试每个POJO的功能。

POJO经常在Java开发中使用,特别是在轻量级的框架和技术中,如Spring框架、Hibernate ORM等。它们可以作为数据传输对象(DTO)或领域模型对象(Domain Model)使用,用于表示业务实体和数据传递。

总而言之,POJO是指普通的、简单的Java对象,它不依赖于特定的框架或技术。POJO的设计原则是简单、可重用和可测试,使得它们在Java开发中广泛应用。

Spring赋予POJO魔力的方式之一就是通过DI来装配它们

3、依赖注入 DI

依赖注入这个词让人望而生畏,现在已经演变成一项复杂的编程技巧或设计模式理念。但事实证明,依赖注入并不像它听上去那么复杂。在项目中应用Dl,你会发现你的代码会变得异常简单并且更容易理解和测试。

3.1、DI功能是如何实现的

任何一个有实际意义的应用(肯定比Helo wrd示例更复杂)都会由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。按照传统的做法,每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这将会导致高度耦合和难以测试的代码。

public class DamselRescuingKnight implements Knight {

	private RescueDamselQuest quest;
	
	public DamselRescuingKnight() {
		this.quest = new RescueDamselQuest();
	}

	public void embarkOnQuest() {
		quest .embark();
	}
}

RescueDamselQuest 与上面的类紧耦合。

耦合具有两面性 (two-headed beast)。

  • 一方面,紧密合的代码难以测试、难以复用、难以理解,并且典型地表现出“打地鼠"式的buo特性(修复一个bug,将会出现一个或者更多新的bug)。
  • 另一方面,一定程度的合又是必须的一-完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。总而言之,耦合是必须的,但应当被小心谨慎地管理。

通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系,依赖关系将被自动注入到需要它们的对象当中去。

在这里插入图片描述

3.2、构造器注入

public class DamselRescuingKnight implements Knight {

	private RescueDamselQuest quest;
	
	public DamselRescuingKnight(RescueDamselQuest quest) {
		this.quest = quest;
	}

	public void embarkOnQuest() {
		quest .embark();
	}
}

我们可以看到,不同于之前的DamselRescuingKnight,BraveKnight没有自行创建探险任务,而是在构造的时候把探险任务作为构造器参数传入。这是依赖注入的方式之一,即构造器注入 (constructor injection)。

当然除了构造器,还有 set 注入。

3.3、Set 注入

public class DamselRescuingKnight implements Knight {

	private RescueDamselQuest quest;

	public void setQuest(RescueDamselQuest  quest) {
		this.quest = quest;
	}
}

在这里插入图片描述