Spring核心原理

1、Spring简化开发的四个基本策略

1、基于POJO的轻量级和最小侵入性编程

2、通过依赖注入和面向接口松耦合

3、基于切面和惯性进行声明式编程

4、通过切面和模板检测样板式代码

2、AOP、IOC、DI之间的关系

IOC控制反转:创建实例对象的控制权从代码转换到Spring容器。

AOP面向切面编程:是对方法进行增强

DI依赖注入:把代码向对象属性或实例对象注入属性值或域属性的控制权限转给Spring容器进行控制

3、Spring5模块结构图

spring核心模块

模块名称主要功能
spring-core依赖注入IOC与DI的最基本的实现
spring-beansBean工厂与Bean的装配
spring-context定义基础的spring的Context上下文即IOC容器
spring-context-support对Spring IOC容器的扩展支持,以及IOC子容器
spring-context-indexerSpring的类管理组件和Classpath扫描
spring-experssionspring表达式语言

spring切面编程

模块名称主要功能
spring-aop面向切面编程的应用模块,整合Asm,CGLib,JDKProxy
spring-aspects集成AspectJ,AOP应用框架
spring-instrument动态Class Loadingg模块

spring数据访问与集成

模块名称主要功能
spring-jdbcspring提供的JDBC抽象框架的主要实现模块,用于简化spring JDBC操作
spring-txspring JDBC事务控制实现模块
spring-orm主要集成Hibernate,Java Persistence API(JPA)和Java Data Objects(JDO)
spring-oxm将java对象映射成XML数据,或者将XML数据映射成java对象
spring-jmsJava Messaging Service能够发送和接收信息

spring之Web组件

模块名称主要功能
spring-web提供了最基础Web支持,主要建立于核心容器之上,通过Servlet或者Listeners来初始化IOC容器
spring-webmvc

实现了Spring MVC(model-web-Controller

)的Web应用

spring-websocket主要是与Web前端的全双工通讯的协议
spring-webflux一个新的非堵塞函数式Reativer Web框架,可以用来建立一步的,非阻塞,事件驱动的服务

spring之通信报文

模块名称主要功能

spring-messaging

从Spring4开始新加入的一个模块,主要职责是为Spring框架集成一些基础的报文传送应用

spring之集成测试

模块名称主要功能

spring-test

主要为测试提供支持

spring之集成兼容

模块名称主要功能

spring-framework-bom

Bill of Materials 解决Spring的不同模块依赖版本不同的问题

spring各模块之间的依赖关系

4、spring实现的基本思路

5、spring IOC

1、spring IOC使用的基础接口

BeanFactory:负责定义容器

BeanDefinition:负责存储配置信息

BeanDefinitionReader:负责读取配置信息

 2、springIOC容器初始化三部曲

 详细加载步骤:淡黄色定位,橘色是加载,棕色是注册

1、寻找IOC容器入口

2、定位配置文件的setConfigLocations()方法

3、AbstractApplicationcontext的refresh()方法

4、AbstractApplicationContext的obtabinFreshBeanFactory()方法

5、AbstractRefreshableApplicationContext子类的loadBeanDefinitions方法

6、AbstractBeanDefinitionReader读取Bean配置资源

7、资源加载器获取要读入的资源

8、XmlBeanDefinitionReader加载Bean配置资源

9、DocumentLoader将Bean配置资源转换成Document对象

10、XmlBeanDefinitionReader解析载入的Bean配置资源文件

11、DefaultBeanDefinitionReader对Bean定义的Document对象解析

12、BeanDefinitionParserDelegate解析Bean配置资源文件中的<bean>元素

13、BeanDefinitionParserDelegate解析<property>元素

 14、解析<property>元素的子元素

15、解析<list>子元素

16、解析过后的BeanDefindition在IOc容器中的注册

17、DefaultListableBeanFactory向IOC容器注册解析后的BeanDefinition

3、applicationContext体系

 1、ClassPathXmlApplicationContext

只能读放在web-info/classes目录下的配置文件

这个方法是从classpath下加载配置文件(适合于相对路径方式加载),例如:

ApplicationContext ctx = new ClassPathXmlApplicationContext( "/applicationcontext.xml ");

该方法参数中classpath: 前缀是不需要的,默认就是指项目的classpath路径下面;这也就是说用ClassPathXmlApplicationContext时默认的根目录是在WEB-INF/classes下面,而不是项目根目录。这个需要注意!

2、FileSystemXmlApplicationXml

这个方法是从文件绝对路径加载配置文件,例如:

ApplicationContext ctx = new FileSystemXmlApplicationContext( "G:/Test/applicationcontext.xml ");

如果在参数中写的不是绝对路径,那么方法调用的时候也会默认用绝对路径来找。

(如果要使用classpath路径,需要加入前缀classpath: )

3、XmlWebApplicationContext:

专为web工程定制的方法,推荐Web项目中使用。

// 用classpath路径
// ApplicationContext factory = new ClassPathXmlApplicationContext("classpath:appcontext.xml");
// ApplicationContext factory = new ClassPathXmlApplicationContext("appcontext.xml");

// ClassPathXmlApplicationContext使用了file前缀是可以使用绝对路径的
// ApplicationContext factory = new ClassPathXmlApplicationContext("file:F:/workspace/example/src/appcontext.xml");

// 用文件系统的路径,默认指项目的根路径
// ApplicationContext factory = new FileSystemXmlApplicationContext("src/appcontext.xml");
// ApplicationContext factory = new FileSystemXmlApplicationContext("webRoot/WEB-INF/appcontext.xml");


// 使用了classpath:前缀,这样,FileSystemXmlApplicationContext也能够读取classpath下的相对路径
// ApplicationContext factory = new FileSystemXmlApplicationContext("classpath:appcontext.xml");
// ApplicationContext factory = new FileSystemXmlApplicationContext("file:F:/workspace/example/src/appcontext.xml");

// 不加file前缀
ApplicationContext factory = new FileSystemXmlApplicationContext("F:/workspace/example/src/appcontext.xml");
IHelloWorld hw = (IHelloWorld)factory.getBean("helloworldbean");
log.info(hw.getContent("luoshifei"));

4、ClassPathXmlApplicationContext加载类图

5、Spring IOC运行时序图(以ClassPathXmlApplicationContext为例)

6、Annotation IOC容器初始化全过程 

7、springIOC源码核心分析(推荐查看)

最详细的Spring核心IOC的源码分析(每次看都有不同的感悟)_Nuomizhende45-CSDN博客_spring源码分析

 springIOC源码中AbstractXmlApplicationContext中的loadBeanDefinitions(DefaultLiatableBeanfactory beanfactory)方法中为XMLBeanDefinitionReader对象添加EntityResolver属性时,EntityResolver(Xml解析器)的含义:

Spring 源码第三弹!EntityResolver 是个什么鬼?_江南一点雨的专栏-CSDN博客

6、spring DI

1、依赖注入的关键类

IOC容器:BeanFactory、AbstractBeanFactory

初始化获得BeanDefinition:SimpleInstantionStrategy(策略实现类)

依赖注入:AbstractPropertyAccessor

真正实例化:BeanWrapper

2、依赖注入发生的时间

1)、用户第一次调用getBean()方法时

2)、用户在配置文件中将<bean>元素配置了lazy-init=false属性,即让容器在解析Bean定义时就触发注入

3、依赖注入执行过程

4、依赖注入时序图

参考博客:

彻底理解 SpringIOC、DI,这篇文章就够了_公众号:Java后端的博客-CSDN博客

最详细的Spring核心IOC的源码分析(每次看都有不同的感悟)_nuomizhende45的博客-CSDN博客_spring源码分析

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring是一个开源的Java应用框架,它的核心原理是基于控制反转(Inversion of Control,IoC)和面向切面编程(Aspect-Oriented Programming,AOP)。 控制反转指的是将对象的创建、依赖注入和管理的责任由程序员转移到了Spring容器中。在传统的开发中,对象的创建和依赖关系的维护通常由程序员手动进行,而在Spring中,这些工作都由Spring容器负责。Spring容器通过配置文件或注解来管理对象的生命周期和依赖关系,程序员只需要定义好对象和它们的依赖关系,就可以从容器中获取到所需的对象。 面向切面编程是一种编程范式,它允许开发者在不改变原有代码逻辑的情况下,通过将横切逻辑(如日志记录、性能监控等)独立地插入到应用程序中。Spring通过AOP模块来实现面向切面编程,它可以通过配置或注解方式来定义切面,然后在需要增加横切逻辑的地方将切面织入到目标对象中。 除了IoC和AOP,Spring还提供了其他一些重要的特性,如事务管理、数据访问、Web开发等。它通过各种模块的集成和扩展来满足不同应用场景的需求。 总之,Spring核心原理是基于控制反转和面向切面编程,通过Spring容器和AOP模块来实现对象的生命周期管理、依赖注入和横切逻辑的插入。这使得开发者可以更加关注业务逻辑的实现,而无需过多关注底层的框架细节。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值