1 Spring 基础

1.1 Spring 概念

Spring 是一个轻量级的 Java 开发框架,,旨在提高开发人员的开发效率以及系统的可维护性。
Spring 的核心是控制反转(IoC)和面向切面编程(AOP)。
Spring 是一个存储对象的容器,容器内不装文本、数字,只装对象。
Spring 的主要作用就是为代码“解耦”,降低代码间的耦合度。就是让对象和对象(模块和模块)之间关系不是使用代码关联,而是通过配置来说明。即在 Spring 中说明对象(模块)的关系。

Spring 根据代码的功能特点,使用 IOC 降低业务对象之间耦合度。 IoC 使得主业务在相互调用过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了。而是由 Spring 容器统一管理,自动“注入” 注入即赋值。而 AOP 使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由 Spring 容器统一完成“织入”。

1.2 Spring 优缺点

优点:

  1. IOC 容器,方便解耦,简化开发
  2. AOP 编程的支持:
  3. 事务的支持:通过注解声明进行事务管理,提高开发效率和质量。
  4. 方便程序的测试:Spring 对 Junit 支持,可以通过注解方便的测试 Spring 程序。
  5. 方便集成各种优秀框架:Spring 提供了对各种优秀框架(如 Struts, Hibernate、Hessian、Quartz)等的直接支持。
  6. 轻量级的框架:从大小与开销两方面而言 Spring 都是轻量的。现在完整的 Spring5 框架只有 82MB。并且 Spring 所需的处理开销也是微不足道的。
  7. 非入侵式的框架:Spring 框架是一个非入侵式的框架,就是我们的系统使用了 Spring,但系统完全不依赖于 Spring 的特定类。
  8. 降低 Java EE API 的使用难度:Spring 对很多难用的 Java EE API(如 JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过 Spring 的简易封装,这些 Java EE API 的使用难度大为降低。
  9. Java 源码是经典学习范例:Spring 的源码设计精妙、结构清晰、匠心独运,处处体现着大师对 Java 设计模式灵活运用以及对 Java 技术的高深造诣。Spring 框架源码无疑是 Java 技术的最佳实践范例。如果想在短时间内迅速提高自己的 Java 技术水平和应用开发水平,学习和研究 Spring 源码将会使你收到意想不到的效果。

缺点

  1. 不易拆分:Spring 框架整合其它框架都是黏在一起,后面拆分的话就不容易拆分了。
  2. 配置繁琐:随着系统工程的增大,系统与第三方的配置文件会大量增加,这也是 Spring 最致命的地方,人称:“配置地狱”。
  3. 依赖反射:Spring 依赖反射,反射影响性能。
  4. 有更好的替代品:对比新出的 SpringBoot,他已经逐渐占领了市场。

1.3 Spring 模块构成

Spring 框架包含的功能大约由 20 个小模块组成。这些模块按组可分为核心容器 (Core Container)、数据访问/集成 (Data Access/Integration)、Web、面向切面编程 (AOP 和 Aspects)、设备 (Instrumentation)、消息 (Messaging) 和测试 (Test)。如下图所示:

Spring Framework Runtime|500
spring core:提供了框架的基本组成部分,包括控制反转(Inversion of Control,IOC)和依赖注入(Dependency Injection,DI)功能。
spring beans:提供了 BeanFactory,是工厂模式的一个经典实现,Spring 将管理对象称为 Bean。
spring context:构建于 core 封装包基础上的 context 封装包,提供了一种框架式的对象访问方法。
spring jdbc:提供了一个 JDBC 的抽象层,消除了烦琐的 JDBC 编码和数据库厂商特有的错误代码解析,用于简化 JDBC。
spring aop:提供了面向切面的编程实现,让你可以自定义拦截器、切点等。
spring Web:提供了针对 Web 开发的集成特性,例如文件上传,利用 servlet listeners 进行 ioc 容器初始化和针对 Web 的 ApplicationContext。
spring test:主要为测试提供支持的,支持使用 JUnit 或 TestNG 对 Spring 组件进行单元测试和集成测试。

1.4 Spring 使用的设计模式

  • 工厂设计模式 : Spring 使用工厂模式通过 BeanFactoryApplicationContext 创建 bean 对象。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 代理设计模式 : Spring AOP 功能的实现是 JDK 动态代理或 CGLIB 字节码生成技术。
  • 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配 Controller
  • 模板方法模式 : Spring 中 jdbcTemplatehibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 装饰者模式: Spring 中配置 DataSource 的时候,DataSource 可能是不同的数据库和数据源。我们能否根据客户的需求在少修改原有类的代码下动态切换不同的数据源?这个时候就要用到装饰者模式 (这一点我自己还没太理解具体原理)。Spring 中用到的包装器模式在类名上含有 Wrapper 或者 Decorator。这些类基本上都是动态地给一个对象添加一些额外的职责.

1.5 Spring 核心容器

Spring 核心容器,即 Spring Core Container,包含四个子模块组成,分别是 Spring-beans、Spring-core、Spring-context 和 Spring-expression (Spring expression Language, SpEl)。
Spring-core 实现了 IOC 和 AOP 部分。
Spring-beans 涉及到 Bean 工厂和 Bean 的装配。
Spring-context 在核心模块上扩展了 BeanFactory,创建 ApplicationContext 接口,提供了更多的功能。
Spring-expression 是 Spring 表达式语言块,可以查询、管理运行中的对象,也可以调用对象方法、操作数组等。

1.6 Spring 不同的事件类型

Spring 的 ApplicationContext 提供了支持事件和代码中监听器的功能,可以创建 bean 来监听 ApplicationContext 中发布的事件。Spring 提供了 5 种标准的事件:

  • 上下文更新事件-在容器调用 ConfigurableApplicationContext 的 refresh ()方法时被触发。
  • 上下文开始事件-当容器调用 ConfigurableApplicationContext 的 Start ()方法开始/重新开始容器时触发该事件。
  • 上下文停止事件-当容器调用 ConfigurableApplicationContext 的 Stop ()方法停止容器时触发该事件。
  • 上下文关闭事件-当 ApplicationContext 被关闭时触发该事件。容器被关闭时,其管理的所有单例 Bean 都被销毁。
  • 请求处理事件-在 Web 应用中,当一个 http 请求(request)结束触发该事件。

如果一个 bean 实现了 ApplicationListener 接口,当一个 ApplicationEvent 被发布以后,bean 会自动被通知。

1.7 Spring 应用程序有哪些不同组件?

接口 - 定义功能。
Bean 类 - 它包含属性,setter 和 getter 方法,函数等。
Bean 配置文件 - 包含类的信息以及如何配置它们。
Spring 面向切面编程(AOP) - 提供面向切面编程的功能。
用户程序 - 它使用接口。