Spring之初识IoC控制反转以及Spring基本概念
引入控制反转概念
将对象的创建权/管理权交出去了,不再使用硬编码的方式了。同时也把对象关系的管理权交出去了,也不再使用硬编码的方式了。像这种把对象的创建权交出去,把对象关系的管理权交出去,被称为控制反转。
控制反转IoC
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计思想,可以用来降低代码之间的耦合度,符合依赖倒置原则。IoC可以认为是一种全新的设计模式,但是理论和时间成熟相对较晚,并没有包含在GoF中。(GoF指的是23种设计模式)。Spring框架就是一个实现了IoC思想的框架。
控制反转思想的核心是:将对象的创建权交出去,将对象和对象之间关系的管理权交出去,由第三方容器来负责创建与维护。
控制反转常见的实现方式:依赖注入(Dependency Injection,简称DI)。通常,依赖注入的实现又包括两种方式:
- set方法注入
- 构造方法注入
Spring概述
Spring简介
Spring框架是一个开源的Java应用程序框架,它由Rod Johnson创建。它提供了一系列的模块来简化Java应用程序的开发。
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
Spring最初的出现是为了解决EJB臃肿的设计,以及难以测试等问题。
Spring为简化开发而生,让程序员只需关注核心业务的实现,尽可能的不再关注非业务逻辑代码(事务控制,安全日志等)。
Spring常用模块
注:在Spring5中新增了Webflux模块。
-
Spring Core:
这是Spring框架的核心模块,提供了IoC(Inversion of Control)容器的实现。loC容器负责管理和组织应用程序中的对象,通过依赖注入来管理对象之间的依赖关系。
-
Spring MVC
这是Spring框架的Web开发模块,提供了一个基于MVC(Model-View-Controller)架构的Web应用程序开发框架。它通过DispatcherServlet将请求分发给合适的处理器,并将处理结果返回给客户端。
-
Spring AOP
这是Spring框架的面向切面编程模块,提供了一种在应用程序中实现模切关注点的方式。通过AOP,可以将与业务逻辑无关的功能(如日志记录、性能监测、事务管理等)模块化并集中管理。(扩展1: Spring AOP通俗解释)
-
Spring Web
Spring Web模块提供了基于Servlet技术的Web应用程序开发支持。它包含了Spring MVC框架,用于构建基于MVC架构的Web应用程序。SpringMVC通过DispatcherServlet将请求分发给合适的处理器,并将处理结果返回给客户端。它还提供了一些注解和工具,用于处理URL映射、请求参数绑定、视图解析等。
-
Spring ORM
它可以与Hiberate、MyBatis等ORM框架集成,简化了数据访问层的开发。Spring ORM提供了一些模板类和注解,用于简化数据库操作、事务管理等操作。
-
Spring Context
Spring Context模块是Spring框架的核心模块之一,提供了IoC容器的实现。loC容器负责管理和组织应用程序中的对象,通过依赖注入来管理对象之间的依赖关系。Spring Context模块还提供了一些高级特性,如面向切面编程(AOP)、事件传播、国际化支持等。
-
Spring DAO
Spring DAO模块是Spring框架中的数据访问对象(DAO)支持模块。它提供了一种简化和统一的方式来访问和操作各种数据存储,如关系型数据库、NoSQL数据库、缓存等。Spring DAO模块可以与 ORM框架(如Hibernate.MyBatis)集成,也可以直接使用JDBC进行数据库操作。它提供了一些模板类和注解,用于简化数据库操作、事务管理等。
-
Spring Webflux
Spring Webflux是Spring框架的响应式编程支持模块。它基于Reactive Streams规范,提供了一种非阻塞的、异步的编程模型,SpringWebflux可以用于构建响应式的Web应用程序和服务。它提供了一些注解和函数式编程的API,用于处理HTTP请求,处理数据流、处理异步操作等。与传统的Servlet容器相比,Spring Webflux可以处理更高的并发请求和更高的吞吐量。
还有其他几个常用模块,未在上图列出:
-
Spring Data
这是Spring框架的数据访问模块,提供了对各种数据访问技术的集成支持。它简化了数据访问层的开发,提供了一种统一的API来访问和操作各种数据存储(如关系型数据库、NoSQL数据库、缓存等)。
-
Spring Security
这是Spring框架的安全模块,提供了身份验证和授权的支持。它可以集成到Spring应用程序中,为应用程序提供安全性保护,如用户认证、授权、密码加密等。
Spring特点
- 轻量
- 从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。
- Spring是非侵入式的:Spring应用中的对象不依赖于Spring的特定类。(扩展2:非侵入式编程)
- 控制反转
- Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反—不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。(扩展3:loC和JNDI的区别)
- 面向切面
- Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
- 容器
- Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
- 框架
- Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。
扩展1: Spring AOP通俗解释
想象一下你正在画一幅画,画中有很多不同的元素,如人物、树、花等。画画时,你可能会有一些特别的需求,比如想要给画中的每个元素都添加一些相同的颜色或纹理。但是,你不想挨个给每个添加,因为那样会很麻烦。
这时,Spring AOP就像一个魔法笔,它可以帮助你在画画的过程中自动添加你想要的颜色或纹理,而无需手动去做。你只需要告诉魔法笔你想要添加的颜色或纹理,然后它会自动帮你完成。
在编程中,我们经常需要在一些特定的地方(例如方法调用或特定的代码段)执行一些相同的操作,比如日志记录、性能监测或事务管理。Spring AOP就像这个魔法笔,它可以自动帮助我们在这些特定的地方添加这些通用操作,而无需手动去每个地方都编写相同的代码。
所以,Spring AOP可以让我们更方便地在代码中添加一些通用的功能,而无需重复编写相同的代码。它是一种在编程中帮助我们实现代码重用和维护的魔法笔。
扩展2:非侵入式编程
非侵入式编程是一种编程范式,它强调在开发应用程序时,不需要对现有代码进行修改或依赖于特定的框架或库。具体来说,非侵入式编程具有以下几个特点:
-
低依赖性:Spring框架的核心容器是一个轻量级的loC容器,它本身的依赖性非常低。这意味着您可以选择性地使用 Spring框架的各个模块,而不需要将整个应用程序都依赖于Spring。您可以根据需要选择性地引入Spring的功能,而不会对应用程序的其他部分产生强耦合。
-
面向接口编程:Spring框架鼓励使用接口进行编程,通过依赖注入将具体实现类与接口解耦。这种面向接口的编程方式使得应用程序的各个组件之间的耦合度降低,增加了代码的可维护性和可扩展性。
-
配置灵活性:Spring框架使用XML、注解和Java配置等方式来进行配置。这种灵活的配置方式使得您可以根据需要对应用程序进行灵活的配置和调整,而不需要修改应用程序的源代码。这种配置的灵活性使得您可以将Spring框架集成到现有的应用程序中,而不需要对原有代码进行大量的修改。
-
面向切面编程:Spring框架提供了面向切面编程(AOP)的支持,可以将与核心业务逻辑无关的横切关注点(如日志、事务管理)模块化并集中管理。这样可以将这些横切关注点与业务逻辑进行解耦,使得应用程序的代码更加清晰和可维护。
综上所述,Spring框架是非侵入式的,因为它可以与现有的应用程序进行集成,而不需要对应用程序进行大量的修改。它通过依赖注入、面向接口编程和配置的灵活性,使得应用程序的各个组件之间的耦合度降低,增加了代码的可维护性和可扩展性。
扩展3:loC和JNDI的区别
loC(Inversion of Control)和JNDI(Java Naming and Directory Interface)是两个不同的概念,它们在思想上有以下区别:
-
控制反转(loC):
- loC是一种设计模式,也称为依赖注入(Dependency Injection),它是一种通过外部容器来管理对象的创建和组装的方式。在loC中,应用程序不再负责创建和管理对象的依赖关系,而是将这些责任交给了一个外部的容器。容器根据配置文件或注解的定义,将对象之间的依赖关系注入到相应的对象中。这种方式将控制权反转给了容器,使得应用程序更加灵活、可扩展和易于维护。
- loC是将对象的控制权交给框架,框架主动为用户提供对象,而不需要用户主动去申请。通过配置文件或注解,用户可以告诉框架需要哪些对象以及它们的依赖关系,然后框架负责创建和管理这些对象,并在需要的时候将它们注入到用户代码中。
-
JNDI
- 是Java平台提供的一种用于访问命名和目录服务的API。它提供了一种统一的方式来访问各种命名和目录服务,如LDAP(Lightweight DirectoryAccess Protocol)、DNS(Domain Name System)等。通过JNDI,应用程序可以在运行时动态地查找和获取命名和目录服务中的对象。JNDI的主要目的是为了实现应用程序与命名和目录服务的解耦,提供一种统一的访问方式。
- JNDI是用户主动去获取对象的一种方式。用户通过JNDI API来访问命名和目录服务,根据对象的名称或其他标识符来查找和获取相应的对象。这种方式需要用户自己编写代码来处理对象的获取和使用。
综上所述,loC和JNDI在对象获取的方式上存在明显的差异。loC框架通过自动创建和管理对象来实现控制反转,而JNDI则需要用户自己编写代码来主动获取对象。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步