Spring源码
Spring框架源码,分为:1、Spring源码 2、Spring AOP源码 3、SpringIOC源码 4、SpringMVC源码
it_lihongmin
不要觉得自己怎么样,现实就是比你厉害的人,比你更努力!
当才华撑不起自己野心的时候,老老实实地踏实学习吧!
展开
-
Spring源码 - @Conditional实现分析
@Conditional是Spring 4出现的注解,但是真正露出价值的是Spring Boot的扩展@ConditionalOnBean等。但是任然使用的是Spring框架进行处理,并没有做太多定制的东西,所以还是先看看@Conditional注解的实现。@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Con...原创 2020-06-28 23:46:21 · 705 阅读 · 0 评论 -
Spring源码 - DeferredImportSelector实现分析
在分析DeferredImportSelector之前,根据名字Deferred(延迟的)ImportSelector。ImportSelector则是将selectImports返回的字符串数组,注册成为Bean,详细过程可以参见:Spring源码-ImportSelector实现分析。那么有几个问题:1)、怎么延迟的;2)、执行时机,或者在什莫时候被调用的;3)、返回后的字符串数组,怎么注册成Bean(或者Beandefinition)。 之前在分析Spring源码时,并没有分析D...原创 2020-06-26 09:57:41 · 3510 阅读 · 1 评论 -
@ControllerAdvice使用场景
目录1、ExceptionHandler2、InitBinder3、ModelAttribute 在Spring MVC进行调用的过程中,会有很多的特殊的需求。比如全局异常,分页信息和分页搜索条件,请求时带来返回时还得回显页面。Spring提供@ControllerAdvice对需要处理的范围进行配置。@Target(ElementType.TYPE)@Retenti...原创 2020-01-02 10:40:06 · 925 阅读 · 1 评论 -
SpringMVC源码(九)- ModelAndView(View为String类型)返回值的解析过程
目录一、ModelAndView返回值的解析过程1、适配返回值解析器并解析(handleReturnValue)-ModelAndViewMethodReturnValueHandler2 、视图和数据处理(getModelAndView)3、结果处理(processDispatchResult)二、View为String类型的解析过程1、适配返回值解析器并解析(hand...原创 2019-12-31 17:28:42 · 1867 阅读 · 0 评论 -
SpringMVC源码(七)- doDispatch - RequestMappingHandlerAdapter的handle(方法的调用)
目录一、RequestMappingHandlerAdapter结构1、完成ControllerAdvice注解相关初始化2、各种类型的解析器站初始化1)、argumentResolvers初始化:2)、initBinderArgumentResolvers(数据绑定解析器列表)初始化:3)、returnValueHandlers初始化:二、RequestMappi...原创 2019-12-30 18:03:30 · 621 阅读 · 0 评论 -
SpringMVC源码(六)- doDispatch - getHandler获取HandlerExecutionChain(调用方法和拦截器链)
目录getHandler1、匹配HandlerMethod1)、获取真实的请求路径2)、匹配需要调用的具体方法封装的HandlerMethodcreateWithResolvedBean(没看懂)2、匹配连接器链,组装返回HandlerExecutionChain对象 为了方便理解,还是继续SpringMVC源码(四)- 常用HandlerMapping和Hand...原创 2019-12-29 14:32:03 · 1224 阅读 · 0 评论 -
SpringMVC源码(八)- @ResponseBody方式的解析流程
目录1、handleReturnValue(适配解析结果)1)、selectHandler(适配返回值解析器-RequestResponseBodyMethodProcessor)2)、handleReturnValue(解析返回结果)writeWithMessageConverters(返回值处理)HttpMessageConverter的write(返回值以输出流输出到客户...原创 2019-12-31 14:52:25 · 1909 阅读 · 1 评论 -
SpringMVC源码(五)- doDispatch - getHandler的准备阶段(@RequestMapping解析注册)
目录一、doDispatch的getHandler1、RequestMappingHandlerMapping结构2、setApplicationContext回调函数3、afterPropertiesSet回调函数1)、获取可能的类2)、解析和注册3)、递归查询所有的方法4)、将RequestMapping注解修饰的方法以RequestMappingInfo返回...原创 2019-12-27 17:47:33 · 904 阅读 · 0 评论 -
SpringMVC源码(四)- 常用HandlerMapping和HandlerAdaptor组合和使用方式
目录一、HandlerMapping和HandlerAdaptor初始化(initStrategies)二、常用的HandlerMapping和HandlerAdaptor组合三、常用的Controller方式1、RequestMappingHandlerAdapter2、HttpRequestHandlerAdapter3、SimpleControllerHandlerA...原创 2019-12-26 14:20:50 · 595 阅读 · 0 评论 -
SpringMVC源码(三)- DispatcherServlet请求分析
目录一、service请求(servlet请求转换为Http请求)二、doService请求(request中添加SpringMVC初始化的九大件信息)三、doDispatchHandlerExecutionChain结构和HandlerInterceptor方法调用一、service请求(servlet请求转换为Http请求) DispatcherServlet作为...原创 2019-12-25 17:57:48 · 208 阅读 · 0 评论 -
SpringMVC源码(二)- DispatcherServlet结构和初始化
目录1、DispatcherServlet结构1)、GenericServlet2)、HttpServlet3)、HttpServletBean4)、FrameworkServlet5)、DispatcherServlet2、DispatcherServlet初始化(九大件的加载和初始化) 上一篇博客知道,SpringMVC中Spring容器的关系是通过监听方...原创 2019-12-25 11:38:17 · 443 阅读 · 0 评论 -
SpringMVC源码(一)- 总览 和 ContextLoaderListener监听启动WebApplicationContext
目录一、SpringMVC总览二、ContextLoaderListener的contextInitialized监听事件1、创建Web类型的ApplicationContext2、执行refresh方法 比如下web.xml配置文件的部分,方便下面的理解:<listener> <listener-class>org.springfr...原创 2019-12-25 10:00:36 · 476 阅读 · 0 评论 -
Spring源码 - @Resource、@PostConstruct、@PreDestroy原理分析(CommonAnnotationBeanPostProcessor - 下)
目录一、注解LifecycleMetadata的生命周期1、findLifecycleMetadata(递归获取生命周期注解添加到容器)2、invokeInitMethods3、invokeDestroyMethods二、注解InjectionMetadata的生命周期1、findResourceMetadata(递归获取@Resource注解添加到容器)2、check...原创 2019-12-24 11:34:10 · 399 阅读 · 0 评论 -
Spring源码 - @Resource、@PostConstruct、@PreDestroy原理分析(CommonAnnotationBeanPostProcessor - 上)
目录一、初始化CommonAnnotationBeanPostProcessor的静态代码块初始化CommonAnnotationBeanPostProcessor的无参数构造初始化二、生命周期和回调时机1、实现了BeanFactoryAware2、继承自InitDestroyAnnotationBeanPostProcessor1)、实现了PriorityOrdere...原创 2019-12-24 11:10:01 · 838 阅读 · 0 评论 -
SpringIoc源码(二十)- BeanFactory(九)- getBean(doCreateBean - initializeBean生命周期回调)
目录1、Aware接口回调2、BeanPostProcessor的postProcessBeforeInitialization方法回调3、ApplicationContextAwareProcessor的postProcessBeforeInitialization4、InitializingBean的afterPropertiesSet回调;自定义init方法回调1)、回调...原创 2019-12-23 12:35:59 · 155 阅读 · 0 评论 -
SpringIoc源码(十九)- BeanFactory(八)- getBean(doCreateBean - populateBean属性填充)
目录1、检查是否跳过属性填充2、根据Autowire模式填充1)、autowireByName2)、autowireByType3、InstantiationAwareBeanPostProcessor#postProcessProperties属性填充4、检查depends-on5、属性设置1、检查是否跳过属性填充boolean continueWithPr...原创 2019-12-23 11:03:03 · 445 阅读 · 0 评论 -
SpringIoc源码(十八)- BeanFactory(七)- getBean(doCreateBean - createBeanInstance实例创建)
目录1、Supplier方式创建对象2、工厂方法创建对象3、有参构造创建对象4、无参构造创建对象 当创建Bean时,肯定是先通过反射创建该对象。只是Spring除了直接用反射实例化对象外还允许传入Supplier、或者设置factory-mtehod等方式。不论哪种方式初始化完成对象的创建后,会将该对象使用装饰器模式设置一些容器属性(丰富该对象)然后进行返回Bea...原创 2019-12-20 16:55:23 · 317 阅读 · 0 评论 -
Spring源码 - @Autowired原理分析(AutowiredAnnotationBeanPostProcessor)
目录1、MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition2、#determineCandidateConstructors3、InstantiationAwareBeanPostProcessor#postProcessProperties 分析完CommonAnnotationBeanPost...原创 2019-12-24 15:58:01 · 832 阅读 · 0 评论 -
SpringIoc源码(十七)- BeanFactory(六)- getBean(doCreateBean总览)
目录1、doCreateBean总览2、将BeanDefinition转化为BeanWrapper3、MergedBeanDefinitionPostProcessor回调4、循环依赖实现5、循环依赖检查6、注册DisposableBean1、doCreateBean总览 继续doCreateBean方法,经历了大致一下步骤(核心步骤(红色部分)后面专门分析)...原创 2019-12-20 10:56:02 · 356 阅读 · 0 评论 -
SpringIoc源码(十六)- BeanFactory(五)- getBean(doGetBean下 - doCreateBean前的准备工作)
目录1、getSingleton2、createBean1)、获取真正的Class类型2)、初始化真正使用的RootBeanDefinition3)、lookup-method和replace-method的处理4)、InstantiationAwareBeanPostProcessor处理(resolveBeforeInstantiation)5)、doCreateB...原创 2019-12-19 14:13:16 · 282 阅读 · 0 评论 -
SpringIoc源码(十二)- ApplicationContext(八)- refresh(initMessageSource)
目录一、initMessageSource二、initApplicationEventMulticaster三、onRefresh四、registerListeners一、initMessageSource 国际化相关:protected void initMessageSource() { ConfigurableListableBeanFactory...原创 2019-12-16 16:28:16 · 230 阅读 · 0 评论 -
Spring源码-@ComponentScan原理分析
目录一、获取AnnotationAttributes属性并且解析二、doScan1)、轮训加载basePackage下的BeanDefinition1、scanCandidateComponents2、doFindPathMatchingFileResources3、isCandidateComponent(验证是否为Component)和初始为ScannedGeneric...原创 2019-12-16 15:02:45 · 652 阅读 · 0 评论 -
SpringIoc源码(十一)- ApplicationContext(七)- refresh(ConfigurationClassPostProcessor下)
目录doProcessConfigurationClass(解析配置类)1、@Component2、@PropertySources、@PropertySource3、@ComponentScans、@ComponentScan4、@ImportSelector、@import5、@ImportResource6、@Bean7、解析接口上的BeandoProce...原创 2019-12-16 10:01:17 · 374 阅读 · 1 评论 -
SpringIoc源码(十四)- ApplicationContext(十)- refresh(finishRefresh和destroyBeans)
目录一、finishRefresh1、clearResourceCaches2、initLifecycleProcessor3、LifecycleProcessor的onRefresh4、ContextRefreshedEvent5、LiveBeansView.registerApplicationContext二、Spring Boot类型的finishRefresh...原创 2019-12-17 16:50:46 · 470 阅读 · 0 评论 -
SpringIoc源码(十三)- ApplicationContext(九)- refresh(finishBeanFactoryInitialization)
目录finishBeanFactoryInitialization1、ConversionService2、StringValueResolver属性替换3、LoadTimeWeaverAware类型4、freezeConfiguration(冻结BeanDifinition)3、preInstantiateSingletons(将所有非懒加载的单利Bean进行初始化)...原创 2019-12-17 15:22:53 · 401 阅读 · 0 评论 -
SpringIoc源码(十)- ApplicationContext(六)- refresh(ConfigurationClassPostProcessor上)
目录ConfigurationClassPostProcessor1、获取所有注册的BeanDefinition2、判断是否需要解析配置1)、先获取AnnotationMetadata信息2)、判断是否需要注解解析3、排序4、ConfigurationClassParser解析、验证和注册1)、ConfigurationClassParser2)、parse(解...原创 2019-12-12 17:20:06 · 548 阅读 · 1 评论 -
SpringIoc源码(十五)- BeanFactory(四)- getBean(doGetBean上 - 缓存中获取)
目录下面为非第一次getBean(已经初始化过一次),获取的最短路径1、获取真实的BeanName(传入的可能是别名等) 1)、判断是否为获取FactoryBean 2)、 判断是否为别名2、从缓存中获取实例(如果已经调用过getBean)3、判断返回真正获取的对象1、如果源名称以&开头,则判断是否为NullBean,判断是否不存在(直接抛异常),...原创 2019-12-18 18:13:12 · 588 阅读 · 0 评论 -
SpringIoc源码(九)- ApplicationContext(五)- refresh(invokeBeanFactoryPostProcessors和registerBeanPostProc)
目录1、invokeBeanFactoryPostProcessors2、registerBeanPostProcessors1)、registerBeanPostProcessors2)、ApplicationListenerDetector1、BeanPostProcessor2、MergedBeanDefinitionPostProcessor3、Destruct...原创 2019-12-11 14:43:08 · 362 阅读 · 0 评论 -
SpringIoc源码(八)- ApplicationContext(四)- refresh(postProcessBeanFactory)
目录postProcessBeanFactory1、AbstractRefreshableWebApplicationContext1)、ServletContextAwareProcessor2)、registerWebApplicationScopes3)、registerEnvironmentBeans2、AnnotationConfigServletWebServe...原创 2019-12-05 18:04:16 · 529 阅读 · 0 评论 -
SpringIoc源码(七)- ApplicationContext(三)- refresh(prepareBeanFactory)
目录prepareBeanFactory1)、设置BeanFactory类加载器2)、设置Spring Expression解析器StandardBeanExpressionResolver3)、ResourceEditorRegistrar4)、ApplicationContextAwareProcessor5)、ignoreDependencyInterface...原创 2019-12-03 21:06:19 · 404 阅读 · 0 评论 -
SpringIoc源码(六)- ApplicationContext(二)- refresh(obtainFreshBeanFactory和StandardEnvironment)
目录1、StandardEnvironment1)、PropertyResolver(Property相关处理)2)、Environment(Spring profiles相关处理)3)、ConfigurablePropertyResolver(类型转换相关ConversionService)4)、ConfigurableEnvironment5)、AbstractEnvi...原创 2019-12-03 16:56:30 · 855 阅读 · 0 评论 -
SpringIoc源码(五)- ApplicationContext(一)- 结构梳理
目录一、ApplicationContext1、接口方法2、实现接口1)、EnvironmentCapable2)、ListableBeanFactory3)、HierarchicalBeanFactory4)、MessageSource5)、ApplicationEventPublisher6)、ResourcePatternResolver二、Appli...原创 2019-12-02 19:24:13 · 609 阅读 · 0 评论 -
SpringIoc源码(四)- BeanFactory(三)- 自定义标签实现和分析
目录1、自定义标签实现1)、定义Bean2)、spring.handlers3)、spring.schemas3)、Spring Xml配置文件4) 、测试2、自定义标签实现分析1)、获取NamespaceHandler2)、获取自定义的解析器(AbstractSingleBeanDefinitionParser的子类) 为什么要看自定义标签,因为Sp...原创 2019-11-26 20:19:03 · 415 阅读 · 0 评论 -
SpringIoc源码(三)- BeanFactory(二)- XmlBeanFactory注册BeanDefinition
目录1、loadBeanDefinitions2、doLoadDocument1)、DocumentBuilderFactory2)、createDocumentBuilder3)、parse(解析Xml)3、registerBeanDefinitions1)、import标签解析2)、alias标签解析3)、bean标签解析3-1)、parseBeanDe...原创 2019-11-26 14:38:27 · 334 阅读 · 0 评论 -
SpringIoc源码(一)- 总览
目录一、BeanFactory1)、注册BeanDefinition2)、getBean二、ApplicationContext三、Spring MVC四、Spring Boot总览:Ioc是Spring的一切的基础,而BeanFactory又是Ioc的基础。1、BeanFactory的实现逻辑2、ApplicationContext与BeanFactory的关...原创 2019-11-25 18:16:02 · 458 阅读 · 0 评论 -
SpringAop源码(七)- 嵌套调用问题分析与解决
目录一、本类嵌套Aop问题分析二、本类嵌套Aop问题解决1、依赖注入自己2、BeanFactoryAware(或者ApplicationContextAware)3、exposeProxy设置为true 之前分析了整个Aop的实现原理和流程。Spring框架的Transactional,Async等都是基于Spring Aop进行实现的。那么很多时候我们在同一个Bea...原创 2019-11-25 15:10:06 · 491 阅读 · 0 评论 -
SpringAop源码(五)- EnableAspectJAutoProxy实现原理(调用)- invoke或者intercept(代理方法执行)
目录一、invoke实现1)、getInterceptorsAndDynamicInterceptionAdvice1、MethodBeforeAdviceInterceptor2、AfterReturningAdviceInterceptor3、ThrowsAdviceInterceptor2)、ReflectiveMethodInvocation.proceed...原创 2019-11-24 02:32:22 · 692 阅读 · 0 评论 -
SpringAop源码(六)- 标签aspectj-autoproxy实现分析
目录1、自定义标签、解析器的加载和调用时机2、AspectJAutoProxyBeanDefinitionParser3、总结1、自定义标签、解析器的加载和调用时机 之前分析过EnableAspectJAutoProxy方式启动Spring Aop的整个代理过程,当前在这之前基本都是使用Xml启动方式,配置如下:<aop:aspectj-autoproxy p...原创 2019-11-24 11:03:28 · 817 阅读 · 0 评论 -
SpringAop源码(三)- EnableAspectJAutoProxy实现原理(中)- getAdvicesAndAdvisorsForBean
目录一、findAdvisorBeans获取所有可用的切面二、findAdvisorsThatCanApply从所有切面中获取可用的切面1)、父类中findAdvisorsThatCanApply2)、本类中 buildAspectJAdvisors1、BeanFactory中获取Object的子类2、遍历,根据名称获取Class3、判断是否是AspectJ注解...原创 2019-11-22 12:47:27 · 1166 阅读 · 0 评论 -
SpringAop源码(四)- EnableAspectJAutoProxy实现原理(下)- createProxy
目录一、buildAdvisors二、proxyFactory.getProxy1、createAopProxy1)、DefaultAopProxyFactory2)、AopProxy2、getProxy三、createProxy总结:四、Aop总结:先梳理一下,上一步拿到的都是Advisor的子类Bean,或者InstantiationModelAwarePo...原创 2019-11-22 12:47:30 · 427 阅读 · 0 评论