zoukankan      html  css  js  c++  java
  • Spring核心概念

    一 Spring核心组件

    1. 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)

    1. XML Schema基于XML,没有专门的语法
    2. XML Schema可以象其他XML文件一样解析和处理
    3. XML Schema比DTD提供了更丰富的数据类型.
    4. XML Schema提供可扩充的数据模型。
    5. XML Schema支持综合命名空间
    6. XML Schema支持属性组。
    2. Context

    ApplicationContext的作用:

    • 标示一个应用环境
    • 利用BeanFactory创建Bean对象
    • 保存对象关系表
    • 能够捕获各种事件
      Context是一个bean关系的集合,又叫IOC容器.
      ApplicationContext子类主要包含这两个方面:
      ConfigurableApplicationContext和WebApplicationContext
      可通过xml,Self-annotated classes,java configuration,Groovy dsl,kotlin dsl等方式去描述bean的关系集合.
    3. Core

    core是发现,建立和维护每个bean之间的关系所需要的一系列工具.
    core定义了资源的访问方式,并由ResourceLoader接口完成资源加载.

    spring架构

    核心容器层

    Core 模块

    提供了框架的基本组成部分,包括 IoC 及依赖注入功能。

    Bean 模块

    实现 Bean 管理,包括自动装配机制等功能; 其中BeanFactory是一个工厂模式的实现。

    Context 模块

    建立在 Core 和 Bean 模块基础上,通常用于访问配置及定义的任何对象。ApplicationContext 是上下文模块的重要接口。

    SpEL 模块

    表达式语言模块提供了运行时进行查询及操作一个对象的表达式机制。

    数据访问/集成

    JDBC 模块

    用于替代繁琐的 JDBC API 的抽象层。

    ORM 模块

    对象关系数据库映射抽象层,可集成JPA,JDO,Hibernate,iBatis。

    OXM 模块

    XML消息绑定抽象层,支持JAXB,Castor,XMLBeans,JiBX,XStream。

    JMS 模块

    Java消息服务模块,实现消息生产-消费之类的功能。

    Transaction 模块

    事务模块为各种 POJO 支持编程式和声明式事务管理。

    Web应用

    Web 模块

    Web MVC 提供了基于 模型-视图-控制器 的基础web应用框架。

    servlet 模块

    实现了统一的监听器以及和面向web应用的上下文,用以初始化 IoC 容器。

    Web-Portlet

    实现在 portlet 环境中实现 MVC。

    Web-Socket 模块

    为 WebSocket连接 提供支持。

    其他模块

    AOP 模块

    提供了面向切面的编程实现,允许开发者通过定义方法拦截器及切入点对代码进行无耦合集成,它实现了关注点分离。

    Aspects 模块

    提供了与 AspectJ 的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。

    Instrumentation 模块

    实现instrumentation支持,一般用以应用服务器的监测。

    Messaging 模块

    为STOMP 提供了支持,STOMP协议是一种简单的文本定向消息协议,是 WebSocket 的子协议。

    二. Spring的核心概念

    1. IOC

    Spring的ioc容器主要有两种,BeanFactory和ApplicationContext.BeanFactory默认延迟初始化,ApplicationContext构建在BeanFactory之上,提供了许多BeanFactory之外的特性(统一的资源加载策略,事件发布,国际化信息支持等),默认容器启动后全部初始化并绑定完成.
    applicationContext是ioc容器的默认配置文件.
    依赖注入分三种: setter injection; constructor injection; interface injection;
    ioc是一种帮助我们解耦各业务对象间依赖关系的对象绑定方式.
    IOC service provider: 提供业务对象的构建管理和业务对象间的依赖绑定.

    2. AOP
    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组织提出的分布式事务的规范,架构主要定义了(全局)事务管理器和(局部)资源管理器之间的接口.是双向的系统接口,在事务管理器以及一个或多个资源管理器之间形成通信桥梁.

     
    image

    jta(Java transaction api)是j2ee的编程接口规范, 是xa协议的java实现,jta事务是外部事务.保证量阶段提交.
    jpa(java persistence api)是java持久化编程接口,定义了java对象和它的持久化之间的联系,也就是object和relation之间的mapping(orm).

     

    实现

    1. 基于消息中间件的处理方式
      在微服务架构中,每个服务操作完数据库后通过事件驱动给下一个消息队列.可以通过jta保证两阶段提交.
    2. 使用和不使用xa实现多个数据资源的分布式事务
      使用xa可以实现对多个资源实现事务.而不使用xa的话,可以通过共享资源/链式事务/最大努力一起提交等方式保证分布式事务.参考

    分布式系统中,对修改数据的处理接口(dml等),需要保证多次相同请求的结果一致这种幂等性,一般给一个请求分配一个唯一的多服务共享的token,标记是否请求过.



    Spring框架由大约20个功能模块组成。这些模块被分为6个部分,分别是:Core Container,Data Access/Integration,Web,AOP,Instrumentation及Test:

    Spring IoC

    控制反转(Inversion of Control,IoC),也被称为依赖注入(DI),是面向对象编程中一种设计理念,用来降低程序代码之间的耦合度。

  • 相关阅读:
    PHP全部手册
    你必须收藏的GitHub技巧
    PV和并发
    api接口
    LeetCode 14. 最长公共前缀
    LeetCode 1037. 有效的回旋镖
    LeetCode 242. 有效的字母异位词
    LeetCode 151. 翻转字符串里的单词
    LeetCode 22. 括号生成
    LeetCode 面试题05. 替换空格
  • 原文地址:https://www.cnblogs.com/SFHa/p/10275242.html
Copyright © 2011-2022 走看看