spring技术内幕——深入解析spring架构与设计原理

简介: 序员与平庸的程序员之间的区别,是在于认为自己的代码重要还是数据结构更加重要。平庸的程序员眼里只有代码,优秀的程序员则关注数据结构及之前的关系。”

序员与平庸的程序员之间的区别,是在于认为自己的代码重要还是数据结构更加重要。平庸的程序员眼里只有代码,优秀的程序员则关注数据结构及之前的关系。”

1、spring的设计理念

spring提供了一个轻量级的开发框架,抽象了实际开发中的很多共性问题;在javaee的开发中,支持pojo和使用javabean的开发方式,使应用面向接口开发、充分支持OO;

通过spring的ioc容器,将复杂的对象耦合关系变成了一个文本化、外部化的工作,通过一个或几个xml文件来方便的对应用对象的耦合关系进行维护、修改和浏览,极大地简化了应用开发;

通过ioc容器的依赖反转,将依赖关系从java对象中解放出来,交给了ioc容器完成,对象之间的关系进行了解耦,对象——对象之间的关系转化成了对象——IOC容器——对象的关系;

IOC容器和AOP模块是spring最为基础的底层抽象,IOC来管理bean对象,aop以动态和非侵入的方式增强服务功能。

2、spring的整体架构

springioc、spring aop、springmvc、springjdbc/orm、spring事务处理、spring的远端调用、spring应用;其中aop以纵向切面的方式贯穿在整个架构中;

Spring 中两个数据结构最核心:① BeanDefinition,用于表示 Bean 的定义;② BeanFactory,用于表示整个 IoC 容器。

3、spring framework的核心:IOC容器的实现

ioc容器概述

面向对象系统:对象封装了数据和对数据的处理,对象的依赖关系主要体现在对数据和方法的依赖上。这种依赖关系可以通过把对象的依赖注入交给框架或者IOC容器来完成

依赖注入:依赖对象获得被反转了,由自身主动地获取反转到交给ioc容器来注入、获取。新建对象、对象的引用赋值等操作交由容器来统一完成。从而将散落在不同代码中的功能相同的部分集中成了容器的一部分,成了面向对象基础设施的一部分。

对面向对象系统中的对象分为2类:数据对象、处理数据的对象。后者不经常变化,很少涉及数据和状态共享的问题,是系统中基础的部分。同时这些对象间依赖关系也很稳定,这些特性非常适合由ioc容器来进行管理

IOC容器的设计与实现:

BeanFactory和ApplicationContext:

我们通常说的ioc容器实际上指的是一些功能各异的容器产品,各有特点

beanfactory:容器的基本功能;applicationcontext:应用上下文,作为容器的高级形态而存在,增加了很多面向框架的特性和适配。

beandefinition:抽象了对bean的定义,管理各种对象,是依赖翻转模式中管理的对象依赖关系的数据抽象,是容器发挥作用的主要数据类型。计算机中,所有的功能都是建立在通过数据对现实进行抽象的基础上的。

IOC容器的接口设计关系:

1、从接口
BeanFactory---HierarchicalBeanFactory---ConfigurableBeanFactory,是一条主要的BeanFactory设计路径。

2、第二条接口设计主线是以ApplicationContext应用上下文接口为核心的接口设计,从
BeanFactory---ListableBeanFactory---ApplicationContext---WebApplicationContext(ConfigurableApplicationContext)。

3、具体的IoC容器都是在以上的接口体系下实现的,比如
DefaultListableBeanFactory,实现了ConfigurableBeanFactory,从而成为一个简单IoC容器的实现。其他的如XmlBeanFactory,都是在DefaultListableBeanFactory的基础上做扩展,ApplicationContext也是如此。

4、BeanFactory是IoC容器最基本的接口,提供的是最基本的IoC容器的功能,比如getBean、containsBean等,其他高级IoC容器接口再在此基础功能上进行扩展。

5、BeanFactory是一个对象工厂,管理Spring中所有的Bean,而FactoryBean是一个特殊的Bean。

IOC容器的创建步骤:

(1)创建IoC配置文件的抽象资源,包含了BeanDefinition的定义信息;

(2)创建一个BeanFactory;

(3)创建一个载入BeanDefinition的读取器;

(4)从定义好的资源位置读入配置信息。

核心属性(Spring 循环依赖):

Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256):Bean 名称到单例 Bean 的映射,用于存放完全初始化好的 Bean。可以理解成,这就是所谓的容器。这是一级缓存。

Map<String, Object> earlySingletonObjects = new HashMap<>(16):Bean “未成熟”单例 Bean 的映射。该 Bean 对象只是被创建出来,但是还没有注入依赖。在容器解决循环依赖时,用于存储中间状态。这是二级缓存。

Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16):Bean 名称到 Bean 的 ObjectFactory 对象的映射,存放 Bean 工厂对象。在容器解决循环依赖时,用于存储中间状态。这是三级缓存。

Bean 的获取过程就类似计算机缓存的作用过程:先从一级获取,失败再从二级、三级里面获取。
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, boolean) 方法

实际中最长使用的是ApplicationContext这个高级形态的IOC容器。他除了具备基本的beanfactory的功能,还集成了很多附加功能:

支持信息源,可以实现国际化。(实现MessageSource接口)

访问资源。(实现ResourcePatternResolver接口,这个后面要讲)

支持应用事件。(实现ApplicationEventPublisher接口)

在ApplicationContext中提供的附加服务

IOC容器初始化:

refresh()方法标志着ioc容器的正式启动。具体包括beandefinition的resources定位、载入和注册三个过程:

IOC容器的初始化分为三个过程实现:

第一个过程是Resource资源定位。这个Resouce指的是BeanDefinition的资源定位。这个过程就是容器找数据的过程,就像水桶装水需要先找到水一样。

第二个过程是BeanDefinition的载入过程。这个载入过程是把用户定义好的Bean表示成Ioc容器内部的数据结构,而这个容器内部的数据结构就是BeanDefition。

第三个过程是向IOC容器注册这些BeanDefinition的过程,这个过程就是将前面的BeanDefition保存到HashMap中的过程。

Spring容器创建之后,会调用它的refresh方法,refresh的时候会做很多事情:比如完成配置类的解析、各种BeanFactoryPostProcessor和BeanPostProcessor的注册、国际化配置的初始化、web内置容器的构造等等。

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
6月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
725 22
|
6月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
2120 0
|
6月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
612 0
|
7月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
545 0
|
5月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
5月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
595 2
|
6月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
375 1
|
6月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
661 1
|
6月前
|
Java 数据库连接 开发者
Spring Framework 核心技术详解
本文档旨在深入解析 Java Spring Framework 的核心技术原理与应用。与侧重于快速开发的 Spring Boot 不同,本文将聚焦于 Spring 框架本身的设计理念、核心容器、控制反转(IoC)、面向切面编程(AOP)、数据访问与事务管理等基础且强大的模块。通过理解这些核心概念,开发者能够更深刻地领悟 Spring 生态系统的设计哲学,并具备解决复杂企业级应用开发问题的能力。
425 4
|
7月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
524 2

推荐镜像

更多
  • DNS