【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技术。对主流框架的良好的整合和集成。

相关推荐
程序猿进阶1 小时前
ThreadLocal 释放的方式有哪些
java·开发语言·性能优化·架构·线程池·并发编程·threadlocal
战族狼魂1 小时前
java代码 识别pdf文件是否含有表格
java·python·pdf
码里法2 小时前
springmvc用配置类替换xml配置
java·spring·mvc
api茶飘香3 小时前
守护应用边界:通过反射API实现安全的输入输出过滤
java·开发语言·python·安全·django·virtualenv·pygame
杀死一只知更鸟debug3 小时前
策略模式的小记
java·开发语言·策略模式
nice666603 小时前
CSS的基本语法
java·前端·css·visual studio code
ever_up9735 小时前
EasyExcel的导入与导出及在实际项目生产场景的一下应用例子
java·开发语言·数据库
小小小小关同学6 小时前
Spring Cloud LoadBalancer
后端·spring·spring cloud
ok!ko6 小时前
设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)
java·开发语言·设计模式
丷丩7 小时前
一个Java中有用的JacksonUtil类
java·json·工具