一 Spring核心组件
- Bean
spring是面向bean的编程(bean oriented programming)
将对象之间的依赖关系转而用配置文件来管理(IOC)
bean的配置由BeanDefinition对象描述.
beanFactory是spring提供的基本IOC容器,可完成作为IOC Service provider的所有职责.
BeanDefinitionReader负责将相应的配置文件内容读取解析,并映射到BeanDefinition,然后将BeanDefinition注册到BeanDefinitionRegistry,之后由BeanDefinitionRegistry完成Bean的注册和加载.
BeanWrapper采用策略模式,默认由cglib动态生成真实Bean,通过PropertyEditor对BeanDefinition中string类型的属性定义转换成真实的成员变量.
BeanFactoryPostProcessor通常会处理容器内所有符合条件的BeanDefinition.
BeanPostProcessor通常会处理容器内所有符合条件的实例化后的对象实例.
bean的xml配置风格中dtd及xsd的区别:
dtd(documente type definition)是xml约束模式语言,是用非xml语法编写的.不可扩展,不支持命名空间,只提供有限的数据类型.
xsd(xml schemas definition)
XML Schema基于XML,没有专门的语法
XML Schema可以象其他XML文件一样解析和处理
XML Schema比DTD提供了更丰富的数据类型.
XML Schema提供可扩充的数据模型。
XML Schema支持综合命名空间
XML Schema支持属性组。 - Context
ApplicationContext的作用:
• 标示一个应用环境
• 利用BeanFactory创建Bean对象
• 保存对象关系表
• 能够捕获各种事件
Context是一个bean关系的集合,又叫IOC容器.
ApplicationContext子类主要包含这两个方面:
ConfigurableApplicationContext和WebApplicationContext
可通过xml,Self-annotated classes,java configuration,Groovy dsl,kotlin dsl等方式去描述bean的关系集合.
BeanFactory和ApplicationContext二者是父子关系
Spring的IoC容器就是一个实现了BeanFactory接口的可实例化类,它就是 Spring IoC 容器的真面目。ioc使用 BeanFactory 来实例化、配置和管理 Bean。
如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的躯体了,ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。
(1)MessageSource, 提供国际化的消息访问
(2)资源访问,如URL和文件
(3)事件传播特性,即支持aop特性
1.ApplicationContext接口继承BeanFactory接口,Spring核心工厂是BeanFactory ,BeanFactory采取延迟加载,第一次getBean时才会初始化Bean, ApplicationContext是会在加载配置文件时初始化Bean。
2.ApplicationContext是对BeanFactory扩展,他可以国际化处理、资源访问、事件传播。 - Core
core是发现,建立和维护每个bean之间的关系所需要的一系列工具.
core定义了资源的访问方式,并由ResourceLoader接口完成资源加载.
二. Spring的核心概念
1 IOC
通过工厂+反射将我们的bean放到容器中,当我们想用某个bean的时候,只需要调用getBean(“beanID”)方法。
优点:解耦、统一管理bean,缺点占用内存多、构造对象慢
Spring的ioc容器主要有两种,BeanFactory和ApplicationContext.BeanFactory默认延迟初始化,ApplicationContext构建在BeanFactory之上,提供了许多BeanFactory之外的特性(统一的资源加载策略,事件发布,国际化信息支持等),默认容器启动后全部初始化并绑定完成.
applicationContext是ioc容器的默认配置文件.
依赖注入分三种: setter injection; constructor injection; interface injection;
IOC是一种帮助我们解耦各业务对象间依赖关系的对象绑定方式.
IOC service provider: 提供业务对象的构建管理和业务对象间的依赖绑定.
2.AOP
允许程序通过分离的应用业务逻辑与系统级别服务。程序员只需专注自己的业务逻辑,而不需要管系统级服务。容器中的对象能享有容器中的公共服务(日志、安全)。
原理
通过动态代理做到这一点。用到了代理模式,代理模式是一种静态代理,而动态代理就是利用反射和动态编译将代理模式变成动态的。得知被代理类后通过反射得知他的一切信息,然后动态编译成代理类的class文件(动态组装成代理类,生成java文件,再编译成class文件)。
优点
提供另外一种编程思路,可以把类似的行为抽离出来统一处理。
1.cglib
动态生成一个要代理的子类,在子类中采用方法拦截的技术拦截所有父类方法的调用.底层使用字节码处理框架asm,来转换字节码并新的类.不能对final方法进行代理.
增加了callablefilter对不同方法执行不同的回调逻辑.
采用fastClass机制对实现被拦截方法的调用.
2.jdk动态代理:
利用反射机制生成一个实现代理接口的匿名类.
代理对象在程序运行时产生,而不是编译期.
对代理对象的所有接口方法调用都会转发到InvocationHandler.invoke()方法.
通过反射调用被拦截方法.
spring的aop主要基于jdk的dynamic proxy,通过advisor实现链式的调用.通过cglib第三方库也可以实现.
事务管理抽象层建立在aop基础之上.
仅提供方法拦截.
aspect切面在Spring中为Advisor,通常只持有一个Pointcut和一个Advice.
spring aop使用ProxyFactory作为织入器.
introduction只能通过接口定义为当前对象添加新的行为.
只有introduction是per-instance类型的advice,不会和其他per-class类型的一样在目标类所有对象实例之间共享,而是会为不同的实例对象保存他们各自的状态以及相关逻辑.
Spring aop的自动代理的实现建立在IOC容器的BeanPostProcessor概念之上.
BeanPostProcessor.png
@AspectJ代表一种定义Aspect的风格,它让我们能够以POJO的形式定义Aspect,没有其他接口定义限制.
Spring AOP使用AspectJ的类库进行Pointcut的解析和匹配,最终的实现机制由Spring AOP提供.
Jointpoint的匹配工作通过ClassFilter和MethodMatcher实现.
3. Spring MVC
dispatcherServlet通过HandlerMapping查找相应的HandlerAdaptor,包括Controller或自定义的Handler,HandlerAdaptor负责返回ModelAndView.
mvc和mvp的区别在于,p层取代了c层,m层和v层解耦.
model:负责网络或数据库中的数据相关的业务逻辑.
view:展现数据的视图结果.
mvvm基于事件驱动,实现v层和mv层的双向绑定.
4. 数据访问
Spring的数据访问层以统一的数据访问异常层次体系为核心,以JDBC API的最佳实践(封装)和统一集成各种ORM方案为两翼,为Java平台的数据访问铺就了一条平坦的大道.
DAO(data access object)模式可以分离数据的访问和存储,很好的屏蔽各种数据访问的差异性.
Spring为当下的Java平台的各种ORM解决方案提供了统一的集成支持,包括数据访问资源的模板化管理,特定的数据访问异常到Spring异常层级体系的转译,以及Spring事务管理支持等.
Orm:object-oriented mapping允许通过面向对象的范式去操作或查询数据库中的数据.
orm重量级架构可定义唯一的数据model,处理数据库连接等繁琐步骤,使用mvc架构,使用方便.但是隐藏了SQL细节,优化复杂SQL语句不如手工好.
5. 事务
PlatformTransactionManager是Spring事务抽象架构的核心接口,主要作用是为应用程序提供事务界定的统一方式.
本地事务:在单个EIS或数据库本地并且限制在单个进程内的事务.不涉及多个数据来源.
全局事务:资源管理器管理和协调事务,可以跨越多个数据库和进程.资源管理器一般使用xa二阶段提交协议与EIS或数据库进行交互.
6. 扩展: 分布式事务
理论
cap定理:
一致性(consistence): 大都以最终一致性为目标设计分布式事务.there is only one consensus protocol, and that’s Paxos” – all other approaches are just broken versions of Paxos.
可用性(available),
分区容错性(Partition,集群系统一部分服务发生故障后,仍然能对外保证):分布式系统需要通过分区容错来避免由于网络,机器故障等原因造成的问题.所以分区容错性必不可少,否则可用性都无法保证.
两阶段提交two-phase commit
参与者将操作成败通知协调者,再有协调者根据所有参与者的反馈情报决定各参与者是否要提交操作还是终止操作.
保证分布式事务的原子性:所有结点要么全做要么全不做.
1 phase:准备阶段(投票阶段)
2 phase:提交阶段(执行阶段)
缺点:
同步阻塞 单点故障 数据不一致 宕机导致提交丢失
三阶段提交three-phase commit:
改动:
引入超时机制(协调者和参与者都引入)
将量阶段提交协议的第一个阶段拆成了两步:询问,然后再锁资源,最后真正提交.
优点:
解决单点故障,减少阻塞
API
xa是由x/open组织提出的分布式事务的规范,架构主要定义了(全局)事务管理器和(局部)资源管理器之间的接口.是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信桥梁.
jta(Java transaction api)是j2ee的编程接口规范, 是xa协议的java实现,jta事务是外部事务.保证量阶段提交.
jpa(java persistence api)是java持久化编程接口,定义了java对象和它的持久化之间的联系,也就是object和relation之间的mapping(orm).
实现
- 基于消息中间件的处理方式
在微服务架构中,每个服务操作完数据库后通过事件驱动给下一个消息队列.可以通过jta保证两阶段提交. - 使用和不使用xa实现多个数据资源的分布式事务
使用xa可以实现对多个资源实现事务.而不使用xa的话,可以通过共享资源/链式事务/最大努力一起提交等方式保证分布式事务.参考
分布式系统中,对修改数据的处理接口(dml等),需要保证多次相同请求的结果一致这种幂等性,一般给一个请求分配一个唯一的多服务共享的token,标记是否请求过.
作者:liaowenhao
链接:https://www.jianshu.com/p/776fcc00cc3c
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。