1、Spring简化开发的四个基本策略
1、基于POJO的轻量级和最小侵入性编程
2、通过依赖注入和面向接口松耦合
3、基于切面和惯性进行声明式编程
4、通过切面和模板检测样板式代码
2、AOP、IOC、DI之间的关系
IOC控制反转:创建实例对象的控制权从代码转换到Spring容器。
AOP面向切面编程:是对方法进行增强
DI依赖注入:把代码向对象属性或实例对象注入属性值或域属性的控制权限转给Spring容器进行控制
3、Spring5模块结构图
spring核心模块
模块名称 | 主要功能 |
spring-core | 依赖注入IOC与DI的最基本的实现 |
spring-beans | Bean工厂与Bean的装配 |
spring-context | 定义基础的spring的Context上下文即IOC容器 |
spring-context-support | 对Spring IOC容器的扩展支持,以及IOC子容器 |
spring-context-indexer | Spring的类管理组件和Classpath扫描 |
spring-experssion | spring表达式语言 |
spring切面编程
模块名称 | 主要功能 |
spring-aop | 面向切面编程的应用模块,整合Asm,CGLib,JDKProxy |
spring-aspects | 集成AspectJ,AOP应用框架 |
spring-instrument | 动态Class Loadingg模块 |
spring数据访问与集成
模块名称 | 主要功能 |
spring-jdbc | spring提供的JDBC抽象框架的主要实现模块,用于简化spring JDBC操作 |
spring-tx | spring JDBC事务控制实现模块 |
spring-orm | 主要集成Hibernate,Java Persistence API(JPA)和Java Data Objects(JDO) |
spring-oxm | 将java对象映射成XML数据,或者将XML数据映射成java对象 |
spring-jms | Java 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源码分析