Spring源码分析
2022-08-28 15:34:59 26 举报
Spring源码分析是对Spring框架的核心代码进行深入研究,以理解其内部工作原理和设计思想。这包括对IOC容器、AOP、事务管理等关键模块的源码解读。通过源码分析,可以更深入地理解Spring如何实现依赖注入,如何利用动态代理实现AOP,如何处理事务等关键技术。同时,也可以从中学习到优秀的设计模式和编程技巧。此外,源码分析也是解决实际开发中遇到问题的重要手段,因为很多时候,官方文档和社区讨论并不能完全解答所有疑问。总的来说,Spring源码分析是提升Java开发技能,提高项目质量的重要途径。
作者其他创作
大纲/内容
桥接模式Bridge
同一瞬间
spring-jms
registerBeanDefinition
HandlerAdapter
根据配置创建AopProxy.默认的实现是,如果目标类是接口的话,就使用jdk的动态代理,否则用cglib
5
初始化阶段
spring-core
postProcessXml()
createBeanInstance()
DispatcherServlet
HttpResponse
spring-expression
用户与产品之间的问题
迭代器模式Iterator
MethodMatcher
2
TargetClassAware
+getTargetClass():Class
ISO GB
观察者模式Observer
数据库中表查询出来的对象会赋值给DTOMVC中Model把DTO中的值会赋值给VO再VO中的值传输到View中去复制,就是要把DTO中每一个属性的值赋值给VO中的每一个属性的值,属性名称相同、属性类型相同apache 反射去实现(原型模式)clone() 克隆羊、克隆人 DNA把对象中配置的依赖关系,在每次使用对象之前,都会创建一个新的对象,并且会将依赖关系完整的赋值给这个新创建的对象 scope=\"prototype\" 给Spring默认是单例模式
定位、加载、注册
doGet/doPost
给对象增加职责
开始跟配置文件扫描加载需要实例化的类并且保存到IOC容器中
spring-instrument-tomcat
Controller
parseBeanDefinitionElement(root)
doRegisterBeanDefinitions()
doDispatch
spring-aop
Core Container
ThreadB@bbbb
创建组合
applyDefaultViewName
享元模式Flyweight
parseBeanDefinitionElement
populateBean()
AbstractAutowireCapableBeanFactory
DefaultAopProxyFactory
spring-context
write()
定位配置文件,读取用简单properties代替
构造方法
parsePropertySubElement
WebSocket
AbstractBeanFactory
没有实例产生实例的过程是动态的必然会放到方法才能创建实例synchronized
spring-aspects
BeanDefinitionReaderUtils
实例化成功
B
Web
单例模式
PointcutAdvisor
Beans
如果加载出现异常则调用destroyBeans()方法销毁容器中的对象
配置Servlet
调用instantiate()方法
refresh()
一声令下:所有线程开始奔跑等待所有的运动员到达终点,才能开始进行排名
DefaultBeanDefinitionDocumentReader
spring-web
preProcessXml()
共享策略
spring-websocket
定位
真正调用的是refreshBeanFactory()
setConfigLocations(resource) 保存所有的配置信息
spring-instrument
ThreadA@aaaa
Advised
注册
postProcessXml
ClassPathXmlApplicationContext
servlet-pattern
spring-beans
请求处理阶段
工厂本身配置文件日历
spring-jdbc
ProxyCreatorSupport
配置一个请求路径的规则,通常会配置成/*
命令模式Command
BeanDefinition 相当于是保存在内存中的配置文件,保存了所有的跟类属性相关信息依赖注入,就是把BeanDefinition中的信息读取出来,利用反射机制,或者代理机制创建对象,新创建的对象,不会放到我们印象中的IOC容器中,它存入到另外一个cache容器Wrapper对原生对象的包装,通过构造方法存储原始对象,放入cache的只是Wrapper减少代码侵入,能够在原生的基础之上,再进行扩展,监听器、回调函数、标记信息
OXM
BeanDefinitionValueResolver
装饰器模式为了某个实现类在不修改原始类的基础上进行动态地覆盖或者增加方法该实现保持跟原有类的层级关系采用装饰模式装饰器模式实际上一种非常特殊的适配器模式
Spring Framework 5 Runtime
设计模式:怎么做人?孔夫子:中国人来说:出生 二十加冕、三十而立、四十不惑、五十知天命六十花甲 ....经验之谈:总结前人的经验,提供给后人去借鉴使用前人栽树,后人乘凉解决一些具有代表新的一些问题设计模式,通常来源于生活,反过来帮助我们更好生活设计模式,提升代码的可读性、可扩展性、维护成本、复杂的业务问题忠告:千万千万不要死记硬背每个设计模式都会结合一个生活案例去讲解,穷举法
载入
配置servlet-pattern
A
Instrument
spring-test
parseCollectionElements
ilter that restricts matching of apointcut or introduction toa given set of target classes.
共享终结符
instantiateWithMethodInjection()
classpath:application.xml
避免滞后
web.xml
ClassFilter
动态地配置工厂
parseBeanDefinitions()
spring-context-support
3
单例模式Singleton
Messaging
Advisor
使用组合命令
BeanWrapperImpl
doLoadBeanDefinitions()
BeanDefinition 为什么?
spring-orm
getHandlerAdapter根据方法的参数,进行动态匹配,能够自动转型
ApplicationContextAware
依赖注入
2018/04/25 20:30直播 Tom老师
注册登记式:每使用一次,都往一个固定的容器中去注册并且将使用过的对象进行缓存,下次去取对象的时候,就直接从缓存中取值,以保证每次获取的都是同一个对象IOC中的单例模式,就是典型的注册登记式单例
Core
AbstractRefreshableConfigApplicationContext
流水线一条流水线只生产一个产品A 某个零件B 某个零件...
WebFlux
调用resolveViewName()方法,最终是返回字符串
代理模式Proxy
观察者模式(订阅方) 解耦
Cglib2AopProxy
AbstractAutoProxyCreator
调用loadBeanDefinitions(resource)
DispatchServlet
Aspects
XmlBeanDefinitionReader
状态模式State
工厂方法模式Factory Method
保存迭代状态
单个实例
instantiateWithMethodInjection
doDispatch()
浏览器发送请求,自动调用doService()
SimpleInstantiationStrategy
FileSystemXmlApplicationContext
配置请求路径规则
applyPropertyValues
对复杂依赖关系的管理
共享状态
ViewResolver
序列化与反序列化保证单例:重写readResolve()
CglibSubclassingInstantiationStrategy
Expression
编程式接口,提供了一些列重载方法用来根据设置的target,interceptors来创建代理
调用resolveValueIfNecessary()方法
getHandler根据用户请求的URL可以获得一个Controller中的Method
DTO和VO之间存在一些属性名称、类型都相同
destroyBeans
MethodInterceptor
4
createBean
调用setPropertyValue()方法
preProcessXml
spring-oxm
JDBC
http://www.gupaoedu.com?id=&type=Model : 将传输数据封装成一个完整的载体View:视图,用来展示或者输出的模块(HTML、JSP、JSON、String、Swing、xml...)Control:控制交互一个中间组件,由它来根据用户请求分发不同任务从而得到不同的结果MVC: 基于项目开发的设计模式,用来解决用户和后台交互的问题J2EE标准,JSP页面是一个万能的组件,可以写HTML、可以写JS、写Java逻辑、写SQL语句MVC框架应运而生: Struts1、Struts2、Webwork、SpringMVCSpringMVC:Tom老师,只是MVC设计模式的应用典范,给MVC的实现制定了一套标准M:支持将url参数自动封装成一个Object或者MapV:自己只有一个默认的template、支持扩展,自定义View,而且能够自定义解析C:做到把限制放宽了,任何一个类,都有可能是一个Controller
AopProxy
+getProxy():Object
调用onRefresh()方法
DTO 、VO、POJO、Entity
Request
责任链模式Chain of Responsibility
IOC容器,BeanDefinition这里直接存原始Bean
initStrategies()initMultipartResolver(context);//文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析initLocaleResolver(context);//本地化解析initThemeResolver(context);//主题解析initHandlerMappings(context);//通过HandlerMapping,将请求映射到处理器initHandlerAdapters(context);//通过HandlerAdapter进行多类型的参数动态匹配initHandlerExceptionResolvers(context);//如果执行过程中遇到异常initRequestToViewNameTranslator(context);//直接解析请求到视图名initViewResolvers(context);//通过viewResolver解析逻辑视图到具体视图实现initFlashMapManager(context);//flash映射管理器
配置阶段
调解者模式Mediator
Pointcut
+getClassFilter():ClassFilter+getMethodMatcher():MethodMatcher
建造者模式Builder
增加操作
AdvisedSupport
加载配置文件出错的时候解析类出错的时候初始化抛出不可预知异常的时候以上都会导致IOC容器初始化终止定位:资源配置 import 、classpath、url加载:解析配置文件,把bean包装成BeanDefinition对象注册:把已经初始化的BeanDefinition对象放入到IOC容器之中Spring中的对象,默认是单例的,scope singleSpring中对象 init-lazy默认是false
AbstractXmlApplicationContext
经常使用
AbstractApplicationContext
模板方法模式Template Method
spring-test-mvc
MethodBeforeAdvice
BeanFactory: 主语是Factory(顶层接口) 具体工厂会通过策略模式去实现,不同的工厂生产不同的产品FactoryBean: 主语Bean,所有的工程生产的产品都要实现此接口 简言之:BeanFactory生成出的产品都是FactoryBean大部分情况下BeanFactory本身也是通过BeanFactory创建的也就是说BeanFactory也是一个FactoryBeanBeanFactory和FactoryBean傻傻分不清楚(老虎、老鼠分不清)beanName 和 Instancekey 和 value异曲同工之妙
备忘录模式Memento
AbstractNestablePropertyAccessor
cancelRefresh
改变外表改变内容
调用其父类的loadBeanDefinitions(location)
装饰者模式Decorator
AOP
解释器模式Interpreter
饿汉式:在实例使用之前,不管你用不用,我都先new出来再说,避免了线程安全问题
getBean()
调用loadBeanDefinitions(beanFactory)方法
定义遍历
initStrategies()方法初始化九大组件initMultipartResolver(context);initLocaleResolver(context);initThemeResolver(context);initHandlerMappings(context);initHandlerAdapters(context);initHandlerExceptionResolvers(context);initRequestToViewNameTranslator(context);initViewResolvers(context);initFlashMapManager(context);
ORM
processDispatchResult
固定属性名字contextConfigLocation 指定application.xml路径通常会配置成classpath:application.xml
getHandlerAdapter
不考虑延时加载情况直接赋值根据注解配置来赋值
HandlerMapping
BeanDefinitionParserDelegate
View
spring-webmvc
在web.xml文件中配置一个DispatcherServlet,作为SpringMVC的启动入口
调用resolverViewName()方法
Proxy
+nexProxyInstance():Object
调用createBean()方法
AopProxyFactory
+createAopProxy(config:AdvisedSupport):AopProxy
ObejctFactory
resolveValueIfNecessary
工厂式大规模的标准化的批量的生产
Advice
AdvisorAdapter
加载所有的Bean之后调用 refresh()方法
循环调用parsePropertyElement()
TargetSource
+getTarget():Object
spring-tx
spring-framework-bom
ObjectFactory
小作坊提升产品的质量提高生产的效率
holder of Advice andPointcut
实例化
spring-struts
Context
等待请求根据URL来匹配一个方法今晚不涉及MVC相关东西
Lily老师
doService
Checks whether thetarget method is eligiblefor advice
策略模式Strategy
1
populateBean
其实就是装饰器模式
Test
调用loadBeanDefinitions
定义语法
用工厂方法实现
AbstractBeanDefinitionReader
AbstractPropertyAccessor
doRegisterBeanDefinitions
组合模式Composite
创建代理
Spring5源码分析
调用BeanDefinitionReaderUtils.registerBeanDefinition()方法
init方法
AOP proxy configurationmanagers.配置管理器
instantiate
parsePropertyElements
convert Advice toMethodInterceptor
配置用户名:tom密码:654321配置ftp链接url:ftp远程路径
ProxyFactory
ModelAndView
parseBeanDefinitions
调用handle()方法
6
手写SpringMVC V2.0 版
其他的一些通知不再一 一列出
parsePropertyValue()
CglibSubclassCreator.instantiate
抽象工厂模式Abstract Factory
枚举子女
BeforeAdvice
解决一个并发访问的时候线程安全问题保证单例的技术方案有很多种:饿汉式、懒汉式、注册登记式、枚举式序列化与反序列化的时候出现多例
spring-webmvc-portlet
registerBeanDefinition()
定义算法步骤
C
registerBeanDefinitions()
访问者模式Visitor
setPropertyValues
JMS
AdvisorChainFactory
+getInterceptorsAndDynamiclnterceptionAdvice():List
原型模式Prototype
调用applyDefaultViewName()方法
调用obtainFreshBeanFactory()
getHandler
配置init-param
spring-webmvc-tiles3
spring-webflux
懒汉式:默认加载的时候不实例化,在需要用到这个实例的时候才实例化延时加载
DefaultListableBeanFactory
适配器模式Adapter
parseListElement
JdkDynamicAopProxy
WebMVC
单例模式:初衷就是为了使资源能够共享,只需要赋值或者初始化一次,大家都能够重复利用应用场景:Listener本身单例、日历Calender、IOC容器、配置信息Config技术方案:保证整个运行过程只有一份 饿汉式、懒汉式、注册登记式(枚举式)、反序列如何保证单例解决问题:恶劣环境(程序的健全性)饿汉式:在实例使用之前,不管你用不用,我都先new出来再说,避免了线程安全问题懒汉式:默认不实例化,在需要用到这个实例的时候才实例化,延时加载
调用HandlerAdapter的handle()方法,得到ModelAndView
原生 Bean: 通过反射或者代理机制创建的BeanBeanDefinition: 静态配置文件的一个内存版本,保存了所有的OOP关系BeanWrapper: 是原生Bean的包装,通过构造方法实现包装,真正操作的是WrapperFacoryBean:是Spring中最顶层接口,只要是通过工厂创建Bean,都要实现FacotryBean
共享组合
createBeanInstance
ProxyConfig
Data Access/Integration
原型模式
门面模式Facade
ProxyFactoryBean
-targetName:String-interceptorNames:String[]
+getObject():Object
加载
Interceptor
配置contextConfigLocation
doLoadDocument()
上课目的:为了帮助大家解答一些疑惑,同学们获得更好的体验 更加透彻地理解设计模式:单例模式和原型的应用场景学习效果:抓住重点,理解单例模式和原型模式的设计思想
调用write()方法
根据配置返回给定匹配给定method和class的Interceptor列表
spring-orm-hibernate4
D
一个类模板,在整个系统运行过程中,只允许产生一个实例(有且只有一个)new
Transactions
定义链
0 条评论
下一页