Spring5源码解析-Spring框架中的单例和原型bean 最近一直有问我单例和原型bean的一些原理性问题,这里就开一篇来说说的 通过Spring中的依赖注入极大方便了我们的开发.在xml通过<bean>定义(或者通过@Bean在配置类里定义)对象之后,然后只需简单地使用@Autowired注解,就可以使用由Spring上下文管理的每个对象.需要注意的是,所有这些对象在Spring中默认都是单例. 这一次我们会去讨论Spring如何来管理这些定义的bean.在第一部分中,我们将讲解单例和…
Spring Web框架架构的主要部分是DispatcherServlet.也就是本文中重点介绍的对象. 在本文的第一部分中,我们将看到基于Spring的DispatcherServlet的主要概念:前端控制器模式.第二部分将专门介绍Spring应用程序中的执行链.接下来是DispatcherServlet类的解释.在最后一部分,我们将尝试开发一个自定义的dispatcher servlet. 请注意,本文分析的DispatcherServlet来自Spring的5.0.0.RC3版本.如果使用…
上一个章节,笔者向大家介绍了spring是如何来过滤配置类的,下面我们来看看在过滤出配置类后,spring是如何来解析配置类的.首先过滤出来的配置类会存放在configCandidates列表, 在代码<1>处会先根据配置类的权重做一个排序,权重越低的配置类排在越前,在解析的时候也越先解析.之后会根据configCandidates列表生成一个set集合candidates,防止configCandidates列表存在相同的元素.之后会在<3>处解析这些配置类,并在<4>…
前言: 在分析源码之前,我们简单回顾一下SPring核心功能的简单使用: 容器的基本用法 Bean是Spring最核心的东西,Spring就像是一个大水桶,而Bean就是水桶中的水,水桶脱离了水就没有了什么用处,我们简单看一下Bean的定义,代码如下: package com.vipbbo.spring.Bean; /** * @author paidaxing */ public class MyTestBean { private String name = "paidaxing"…
接上回,我们讲到了refresh()方法中的invokeBeanFactoryPostProcessors(beanFactory)方法主要在执行BeanFactoryPostProcessor和其子接口BeanDefinitionRegistryPostProcessor的方法. 在创建AnnotationConfigApplicationContext对象时Spring就添加了一个非常重要的BeanFactoryPostProcessor接口实现类:ConfigurationClassPos…
ConfigurationClassParser 在ConfigurationClassPostProcessor#processConfigBeanDefinitions方法中创建了ConfigurationClassParser对象并调用其parse方法.该方法就是在负责解析配置类.扫描包.注册BeanDefinition,源码如下: //ConfigurationClassParser#parseSet<BeanDefinitionHolder>) 方法源码 public void pa…
接上回已经讲完了this()方法,现在来看register(annotatedClasses);方法. // new AnnotationConfigApplicationContext(AppConfig.class); 源码 public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { //调用默认无参构造器,里面有一大堆初始化逻辑 this(); //把传入的Class进行注册,Class既可以有@Co…
从启动容器开始 最简单的启动spring的代码如下: @Configuration @ComponentScan public class AppConfig { } public class Main { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); con…
前言 通过往期的文章我们已经了解了Spring对XML配置文件的解析,将分析的信息组装成BeanDefinition,并将其保存到相应的BeanDefinitionRegistry中,至此Spring IOC的初始化工作已经完成,这篇文章主要对Bean的加载进行一个深入的了解及探索. 想要了解Bean就必要要知道接口BeanFactory,接下来我们就从BeanFactory切入 BeanFactory 我们在调用getBean()方法时,无论是显示调用还是隐式调用.都会触发Bean加载的阶段.…
invokeBeanFactoryPostProcessors(beanFactory);方法源码如下: protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { // getBeanFactoryPostProcessors 获取的是 this.beanFactoryPostProcessors; //this.beanFactoryPostProcessors 只…