21天搞定Spring---Spring设计初衷及设计理念(day3)

在真正涉足Spring的核心之前,先了解一下Spring的设计初衷及设计理念是有必要的。它可以让我们从设计者的角度出发思考问题,然后站在巨人的肩膀上去学习并使用这些理念,而不仅仅是学习如何使用这些框架,并且学习设计理念也可以让我们在一个大的方向上对Spring有一个整体的认识。

Spring的设计初衷

Spring的设计初衷其实就四个字:简化编程。但是为了真正做到这四个字,Spring做了很多事情。如:

  1. 约定大于配置
  2. 基于POJO的轻量级和最小侵入性编程(BOP,面向Bean编程)。
  3. 通过依赖注入(DI)和面向接口编程实现松耦合。
  4. 通过切面(AOP)和惯性进行声明式编程。
  5. 通过切面(AOP)和模板减少样板式代码。
Bean设计理念(BOP)

Bean在Spring中是真正的主角。Bean对于Spring就像Object对于OOP(面向对象编程)一样。Spring IoC容器(也叫Bean容器)通过配置文件或者注解的方式来管理对象及对象与对象之间的依赖关系。

控制反转(IoC)的基本概念是:不创建对象,只描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。由容器负责创建对象。

注意IoC(控制反转)和DI(依赖注入)的区别:

IoC是实现的目标,而DI是一种实现IoC的手段。但是实现IoC并不仅仅只能通过DI(依赖注入)实现,也可以通过依赖查找实现。但Spring通过DI实现了IoC控制反转。

BeanFactory设计理念

Spring的最高级抽象是BeanFactory接口,见名知意,它是工厂模式的实现,允许通过名称创建和索引对象。BeanFactory负责管理对象之间的关系。

BeanFactory底层支持两个对象模型:

  1. 单例模型(默认):提供了具有特定名称的全局共享实例对象,可以在查询时对其进行检索。
  2. 原型模型(可通过scope=prototype进行修改):确保每次检索都会创建单独的实例对象。在每个用户都需要自己独立的对象时,采用原型模型。
AOP编程理念

AOP,即面向切面编程,它允许程序员对横切关注点或横切典型的职责分界线的行为进行模块化。

  1. AOP的核心构造是切面,它将那些影响多个类的行为封装到可重用的模块中。
  2. AOP和IoC是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。
  3. AOP的功能已经完全继承到了Spring事务、日志等场景中。例如通过@Transactional注解可以轻松的实现事务的管理。
  4. AOP编程的常用场景有:权限认证,自动缓存(Cache),异常处理(ExceptionHandler),调试,日志以及事务等。

Spring架构设计

Spring由多个模块组成,每个模块都可以单独存在,也可以将一个或多个模块联合起来使用,共同完成业务逻辑。在实际开发中,往往会同时使用Spring的多个模块,如core,aop,web,jdbc等。

核心容器

核心容器模块有spring-beans, spring-core, spring-context, spring-expression四个模块组成:

  1. spring-beans和spring-core模块是spring框架的核心模块,包含了控制反转(IoC)和依赖注入(DI)两部分内容。

BeanFactory通过控制反转将应用程序的配置和依赖性规范与实际的应用程序代码进行了分离。
注意:BeanFactory实例化后,并不会自动实例化Bean,只有当Bean被使用时,BeanFactory才会对该Bean进行实例化与依赖关系的装配。

  1. spring-context模块:架构于核心模块之上,并且依赖于spring-beans和spring-core。扩展了BeanFactory,并为它添加了Bean生命周期控制、框架事件体系及资源加载透明化等功能。
  1. ApplicationContext是该模块的核心接口,它的超类是BeanFactory。

注意:ApplicationContext实例化后会自动对所有的单实例Bean(即前面提到的单例模型下的Bean对象)进行实例化与依赖关系的装配,使之处于待用状态。

  1. spring-expression模块:是统一表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也可以方便的调用对象方法,以及操作数组、集合等。
AOP模块

AOP模块由spring-aop,spring-aspects,spring-instrument 3个模块组成。

  1. spring-aop是Spring的另一个核心模块,是AOP主要的实现模块。以JVM的动态代理技术为基础,设计出了系列AOP横切实现。
  2. spring-aspects模块继承自AspectJ框架,主要是为spring提供更多的AOP实现方法。
  3. spring-instrument模块:主要作用是在JVM启用时,生成一个代理类,程序员通过代理类在运行时修改类的字节码,从而改变一个类的功能,实现AOP。
数据访问模块

数据访问与集成由spring-jdbc,spring-tx,spring-orm,spring-oxm,spring-jms五大模块组成。

  1. spring-jdbc模块:Spring提供的JDBC抽象框架的主要实现模块,用于简化Spring JDBC操作。主要提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理等来简化JDBC编程。
  2. spring-tx模块:是Spring JDBC事务控制实现模块。通过它的AOP配置,可以灵活地在任何一层配置。

事务是以业务逻辑为基础的,一个完整的业务应该对应业务层里一个方法,如果业务操作失败,则整个事务回滚,所以事务控制是应该放在业务层的。
持久层的设计需要遵循一个重要原则:保证操作的原子性,即持久层里的每个方法都应该是不可分割的。

  1. spring-orm模块:ORM框架支持模块,主要用于继承类似JPA等ORM框架,用于资源管理、数据访问对象(DAO)的实现和事务策略。
  2. spring-oxm模块:主要提供一个抽象层以支撑OXM:OXM是一个O/M-mapper,将Java对象映射成XML数据,或者将XML数据映射成Java对象)
  3. spring-jms模块:能够发送和接收消息。
Web模块

Web组件有spring-web,spring-webmvc,spring-websocket和spring-webflux四大模块组成。

  1. spring-web模块:为Spring提供了最基础的web支持,主要建立在核心容器之上,通过Servlet或者Listener来初始化IoC容器,也包含一些Web相关的其他支持。
  2. spring-webmvc模块:是一个Web-Servlet模块,实现了Spring MVC的Web应用。
  3. spring-websocket模块:与Web前端进行全双工通信的websocket协议。
  4. spring-webflux模块:一个新的非阻塞函数式Reactive Web框架,可以用来建立异步的、非阻塞的、事件驱动的服务。并且扩展性非常好。
通信报文模块:

只有一个spring-messaging模块,他是Spring 4 新引入的一个模块,主要职责是为Spring框架集成一些基础的报文传送应用。

集成测试

即spring-test模块,主要为测试提供支持,使得在不需要将程序发布到应用服务器或者连接到其他设施的情况下能够进行一些集成测试或者其他测试。

集成兼容

即spring-framework-bom模块,主要解决Spring的不同模块依赖版本不同的问题。相当于就是Maven的父POM文件,用来管理依赖的版本。

你可能感兴趣的:(Spring,spring)