阅读源码过程中
Spring 的设计初衷
Spring 是为解决企业级应用开发的复杂性而设计,她可以做很多事。但归根到底支撑 Spring 的仅
仅是少许的基本理念,而所有的这些基本理念都能可以追溯到一个最根本的使命:简化开发。这是一个
郑重的承诺,其实许多框架都声称在某些方面做了简化。而 Spring 则立志于全方面的简化 Java 开发。
对此,她主要采取了 4 个关键策略:
1、基于 POJO 的轻量级和最小侵入性编程;
2、通过依赖注入和面向接口松耦合;
3、基于切面和惯性进行声明式编程;
4、通过切面和模板减少样板式代码;
而他主要是通过:面向 Bean(BOP)、依赖注入(DI)以及面向切面(AOP)这三种方式来达成的。
首先介绍下spring中各个模块,如下
核心模块:
spring-core:依赖注入IOC与DI的最基本实现
spring-beans:Bean工厂于Bean的装配
spring-context:IOC容器
spring-context-suipport:对spring ioc容器的扩展支持,以及ioc子容器
spring-context-indexer:Spring的类管理组件和classpath扫描
spring-expression:spring表达式语言
切面编程模块:
spring-aop:面向切面编程的应用模块,整合asm、cglib、jdkProxy
spring-aspects:集成AspectJ,AOP应用框架
spring-instrument:动态类加载模块
数据访问与集成模块:
spring-jdbc:spring提供的jdbc抽象框架的主要实现模块,用于简化jdbc操作
spring-tx:手误控制实现
spring-orm:主要集成hibernate、jpa
spring-oxm:将java对象映射成xml数据,或者将xml映射成java对象
spring-jms:消息
web模块:
spring-web:提供基础web支持,主要建立于核心容器之上,通过servlet或listeners初始化ioc
spring-webmvc:实现了springMVC的web应用
spring-websocket:主要是与web前端的全双工通讯协议
spring-webflux:一个新的非阻塞函数式Reactive Web框架,可以用来建立异步的,非阻塞、事件驱动的服务
通信报文模块:
spring-messaging:spring4开始新加入的一个模块,主要职责是为spring集成一些基础的保温传送应用
集成测试模块:
spring-test:为spring提供测试支持
引入一张图可以让我们很好的看出各个模块之间的关系:
本章内容会先介绍spring中ioc模块
spring的设计思想
OOP:面向对象编程;用程序描述生活(需求转换成代码实现)
BOP:面向bean编程;解放程序员的双手,提出一种管理代码理念。一切从bean开始
AOP:面向切面编程;找出多个bean中有一定规律的代码,开发时将其拆开,运行时将其合并;
就是面向规则编程
IOC:控制反转;创建对象的权利反转给spring(BeanFactoty)
DI:spring保存对象之间的关系,自动注入赋值;方式:构造、set、直接赋值(反射)
AOP 编程理念
面向切面编程,即 AOP,是一种编程思想,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。
AOP 的核心构造是方面(切面),它将那些影响多个类的行为封装到可重用的模块中。AOP 和 IOC 是补充性的技术,它们都运用模块化方式
解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。
在 AOP方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服
务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。
AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。
AOP 编程的常用场景有:Authentication(权限认证)、Auto Caching(自动缓存处理)、Error Handling
(统一错误处理)、Debugging(调试信息输出)、Logging(日志记录)、Transactions(事务处理)等。
依赖注入的基本概念
Spring 设计的核心 org.springframework.beans 包(架构核心是 org.springframework.core包),它的设计目标是与
JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将
其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,
允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory 最底层支持两个对象模型。
1,单例:提供了具有特定名称的全局共享实例对象,可以在查询时对其进行检索。Singleton 是默
认的也是最常用的对象模型。
2,原型:确保每次检索都会创建单独的实例对象。在每个用户都需要自己的对象时,采用原型模式。
Bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 则将处理事情的责任从应用程序代码转移到
框架。
spring中使用到的设计模式
1.模板方法模式
应用场景:JdbcTemplate、HttpServlet
2.简单工厂
应用场景:spring中有两种bean,一种是普通bean,另一种是工厂bean。FactoryBean就是spring中工厂类的顶级接口,当通过类
名获取类的实例的时候,如果该类是一个工厂类即实现了Factory,他会自动调用其getObject方法,返回真的需要的对象。
3.工厂方法
应用场景:使用xml配置bean的时候,bean标签有个factory-method属性,该属性的值生成类的静态方法名。
4.观察者
应用场景:ContextLoaderListener
5.装饰器
应用场景:HttpHeadResponseDecorator
6.代理
应用场景:ProxyFactory、JdkDynamicFactory、CglibAopFactory
7.单例
应用场景:spring中的bean默认是单例的。
8.适配器
应用场景:AdvisorAdapter、HanderAdapter
9.原型模式:
应用场景:ProtorypeBean
本章只是介绍spring中包含模块、设计思想以及使用到的设计模式,后面的文章会进行各个模块的源码解读!