【Java 第十一篇章】spring简单介绍

一、概述

Spring 是一个广泛应用于企业级 Java 开发的开源框架,它提供了一种全面的、轻量级的解决方案来构建灵活、可维护和高效的应用程序。

二、Spring的核心的组件

核心模块名称 描述
Spring IOC 包含了最为基本的Ioc容器BeanFactory的接口和实现,也就是说,在这个Spring的核心包中,不仅定义了IOC容器的最基本的接口(BeanFactory),也提供了一系列这个接口的实现,如XmlBeanFactory就是一个最基本的BeanFactory(IOC容器)。
Spring Aop 这也是Spring的核心模块,围绕这个AOP的增强功能,Spring 集成了AspectJ作为AOP的一个特定实现,同时还在JVM动态代理、CGLIB的基础之上,实现了一个AOP框架。作为Spring集成其他模块的工具,比如事务 就是通过AOP集成到项目中的。
Spring MVC Spring MVC 是以DispatcherServerlet为核心,实现了MVC模式,包括怎样和web容器环境的集成,web 请求的拦截、分发、处理和ModelAndView 数据的返回,以及如何集成各种UI视图展示和数据表现。
Spring JDBC/Spring ORM Spring JDBC主要封装了对数据库的操作。 Spring ORM主要是将从数据库中查出来的数据,映射到对象中。
Spring事务处理 Spring 事务处理是一个通过Spring AOP实现自身功能增强的典型模块。
Spring 远程调用 Spring 为应用带来的一个好处就是能够将应用解耦。应用解耦,一方面可以降低设计的复杂性,另一方面,可以在解耦以后将应用模块分布式部署,从而提高系统整体的性能。
Spring应用 从严格意义来说,这个模块不属于spring模块,这个部分是扩展的spring。

三、核心概念和特点

1、依赖注入 (Dependency Injection,DI)

  • 概念

这是 Spring 的核心特性之一。它允许对象之间的依赖关系在运行时由容器自动注入,而不是在代码中显式地创建依赖对象。例如,一个Service类可能依赖于一个DAO(数据访问对象)类,在传统方式下,Service类可能需要在其内部实例化DAO对象。但在 Spring 中,通过依赖注入,容器会自动将DAO对象实例传递给Service类,Service类只需要接收这个已经实例化好的DAO对象即可。

  • 作用

提高代码的可测试性:因为对象的依赖关系是通过外部配置而不是硬编码在代码中,所以在单元测试中可以方便地替换模拟对象来测试Service类的功能,而不需要关心DAO对象的具体实现。

降低代码的耦合度:各个组件之间的依赖关系更加清晰和松散,使得代码更容易维护和扩展。当需要更换DAO的实现或者添加新的功能时,只需要修改配置文件,而不需要修改Service类的代码。

2、面向切面(Aspect Oriented Programming,AOP)

  • 概念

AOP 是一种编程范式,它允许开发者将横切关注点(如日志记录、事务管理、安全检查等)与业务逻辑分离。在 Spring 中,通过 AOP 可以将这些横切关注点定义为切面,然后在不修改业务代码的情况下,将切面应用到目标对象(被增强的对象)上。

  • 作用:

代码复用:例如,对于日志记录功能,不需要在每个业务方法中重复编写日志记录代码,而是通过定义一个日志切面,将日志记录逻辑集中在一处,然后应用到多个需要记录日志的方法上。

清晰的关注点分离:业务逻辑代码可以更加专注于核心业务功能,而将非业务相关的横切关注点(如事务处理、安全等)从业务代码中分离出来,提高代码的可读性和可维护性。

3、控制反转(Inversion of Control,IoC)容器

  • 概念

Spring 框架是一个 IoC 容器,它负责创建、管理和组装应用程序中的对象。IoC 是一种设计模式,它将对象的创建和依赖关系的管理从应用程序代码转移到容器中。容器根据配置文件或注解等信息,自动创建对象并注入它们之间的依赖关系。

  • 作用

简化对象管理:开发者不需要手动实例化和管理对象的生命周期,容器会负责这些工作。例如,当一个对象需要另一个对象作为依赖时,容器会自动创建并提供这个依赖对象,开发者只需要关注对象的使用,而不是创建过程。

提高代码的可维护性:由于对象的创建和管理集中在容器中,当应用程序的结构发生变化时,只需要修改容器的配置,而不需要在大量的代码中进行修改。

  • IOC 实现策略

依赖查找(Dependency Lookup)

  • 原理
    • 容器会向组件提供回调接口和上下文条件。在这种模式下,组件自身需要通过容器提供的特定 API 来主动查找其所需要的资源和协作对象。
    • 虽然名为控制反转,但实际上真正体现控制反转的部分相对有限,主要只体现在容器会调用组件的回调方法这一点上。通过这种方式,当容器调用回调方法时,应用代码才能够获得相关的资源。
  • 举例
    • 以 EJB(Enterprise JavaBeans)为例,EJB 组件可能需要通过 EJB 容器提供的特定接口和方法来查找数据库连接等资源。比如,一个 EJB 组件要访问数据库,它可能需要使用 EJB 容器提供的查找方法来获取数据库连接对象,而不是自己直接去创建连接。类似地,在 Apache Avalon 框架中,组件也需要通过 Avalon 容器提供的方式来查找其依赖的其他组件或资源。
  • 特点
    • 这种方式要求组件对容器有一定的了解,因为它需要使用容器提供的 API 进行资源查找。并且在一定程度上,组件还是有一些主动查找资源的行为,控制反转没有那么彻底。

依赖注入(Dependency Injection)

  • 原理
    • 组件自身不需要进行定位查询来获取其依赖的对象。它只需要提供普通的 Java 方法(比如设值方法或构造函数),然后由容器来全权负责组件的装配工作。
    • 容器会根据组件之间的依赖关系,将符合要求的对象通过 JavaBean 属性(设值方法注入)或者构造函数(构造器注入)传递给需要的对象。这样组件就不需要关心如何获取其依赖的对象,完全由容器来处理。
  • 设值方法注入(Setter Injection)
    • 例如有一个UserService类,它依赖于一个UserDao对象来进行数据库操作。在设值方法注入中,UserService类会有一个setUserDao的设值方法。容器在创建UserService对象之后,会将一个已经实例化好的UserDao对象通过调用setUserDao方法传递给UserService对象,从而建立依赖关系。这样,UserService类就可以使用注入的UserDao对象来执行数据库相关的操作,而不需要自己去创建UserDao对象。
  • 构造器注入(Constructor Injection)
    • 还是以UserService为例,它的构造函数可以接收一个UserDao对象作为参数。当容器创建UserService对象时,会通过构造函数将一个UserDao对象实例传递进去。这样在UserService对象创建时就已经建立了与UserDao对象的依赖关系。比如UserService的构造函数可能定义为public UserService(UserDao userDao),容器会创建一个UserDao对象并将其作为参数传递给UserService的构造函数来创建UserService对象。
  • 特点
    • 依赖注入方式使得组件与容器之间的耦合度更低,组件更专注于自身的业务逻辑,而依赖关系的建立完全由容器负责,实现了更彻底的控制反转。它提高了代码的可测试性和可维护性,因为在测试时可以方便地通过模拟依赖对象来测试组件的功能,而不需要依赖实际的复杂依赖关系。

四、spring 优点

低侵入式设计,代码的污染极低。将对象的管理交给框架处理,减低组件的耦合性。良好的提供了AOP技术。对主流框架的良好的整合和集成。

相关推荐
Cosmoshhhyyy20 分钟前
LeetCode:3083. 字符串及其反转中是否存在同一子字符串(哈希 Java)
java·leetcode·哈希算法
AI人H哥会Java33 分钟前
【Spring】基于XML的Spring容器配置——<bean>标签与属性解析
java·开发语言·spring boot·后端·架构
开心工作室_kaic43 分钟前
springboot493基于java的美食信息推荐系统的设计与实现(论文+源码)_kaic
java·开发语言·美食
缺少动力的火车1 小时前
Java前端基础—HTML
java·前端·html
loop lee1 小时前
Redis - Token & JWT 概念解析及双token实现分布式session存储实战
java·redis
ThetaarSofVenice1 小时前
能省一点是一点 - 享元模式(Flyweight Pattern)
java·设计模式·享元模式
InSighT__1 小时前
设计模式与游戏完美开发(2)
java·游戏·设计模式
神仙别闹1 小时前
基于Java2D和Java3D实现的(GUI)图形编辑系统
java·开发语言·3d
dbcat官方1 小时前
1.微服务灰度发布(方案设计)
java·数据库·分布式·微服务·中间件·架构