Spring底层


Spring

整体脉络

IOC加载过程


  1. 读取配置类
  2. 扫描配置类@Component @Configuration
  3. 注册bean定义
  4. 扩展节点修改,注册bean定义
  5. 通过bean工厂 getBean(可以生产可以读取)
  6. 实例化,填充属性,初始化,放到MAP(singletonObjects)
  • 详细
    // 加载spring上下文
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
    // 调用父类构造函数,获取BeanFactory
    this.beanFactory = new DefaultListableBeanFactory();
    // 创建读取注解的Bean定义读取器
    this.reader = new AnnotatedBeanDefinitionReader(this); -> 会注册很多后置处理器(解析注解的类,解析autowired注解等等)
    // 创建扫描器,扫描包或类
    this.scanner = new ClassPathBeanDefinitionScanner(this);
    // 注册配置类
    this.register(annotatedClasses);
    // IOC容器刷新接口
    refresh();
  • refresh方法
    // 1.准备刷新上下文环境
    this.prepareRefresh();
    // 2. 获取告诉子类初始化bean工厂,不同工厂不同实现
       ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
    // 3. 对bean工厂填充属性
       this.prepareBeanFactory(beanFactory);
       try {
    	// 留个子类实现该接口
           this.postProcessBeanFactory(beanFactory);
    	// 调用bean工厂后置处理器,将class扫描成beanDefinition(由BeanFactoryPostProcessor后置处理器解析配置类,这里才注册bean定义)
           this.invokeBeanFactoryPostProcessors(beanFactory);
    	// 注册bean后置处理器
           this.registerBeanPostProcessors(beanFactory);
    	// 初始化国际化资源处理器
           this.initMessageSource();
    	// 创建事件多播器
           this.initApplicationEventMulticaster();
    	// 留个子类实现,springboot在这里启动tomcat
           this.onRefresh();
    	// 事件监听器注册到多播器上
           this.registerListeners();
    	// 实例化剩余的单例bean(将bean定义调用getBean,去生产bean)
           this.finishBeanFactoryInitialization(beanFactory);
    	// 容器刷新,发布刷新事件 spring cloud在这里启动
           this.finishRefresh();
       } catch (BeansException var9) {
           if (this.logger.isWarnEnabled()) {
               this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
           }
           this.destroyBeans();
           this.cancelRefresh(var9);
           throw var9;
       } finally {
           this.resetCommonCaches();
       }
  • finishBeanFactoryInitialization(beanFactory)生产bean
    // 为bean工厂创建类型转化器
    // 处理aspectj
    ...
    // 冻结所有bean定义,不能修改了,开始生产
    beanFactory.freezeConfiguration();
    // 实例化剩余单例bean
    beanFactory.preInstantiateSingletons();
  • getBean():判断是否符合工厂生产标准,先从一级缓存拿,拿到就返回,没有就createBean -> BeanPostProcessor(Bean后置处理器创建)
  • BeanFactory:spring顶层核心接口,使用了简单工厂模式,负责生产Bean
  • FactoryBean:被FactoryBean修饰的类成为一个特殊类,通过重写getObject可以在返回类的时候做处理
  • BeanDefinition:spring顶层核心接口,封装了生产bean的一切原料,描述Bean,存储Bean的相关信息,Bean的属性、是否单例、延迟加载、Bean的名称、构造方法等

ApplicationContext BeanFactory

BeanFactory只负责bean的实例化/装配,
ApplicationContext包括BeanFactory所有功能,还具有很多其它功能,管理spring生命周期,加载配置文件,触发类路径扫描

Bean生命周期

  • 实例化,通过反射(由spring控制)和工厂方法(更灵活 可以自己new)
  • 填充属性 -> @Autowired @Value(循环依赖,解决用的三级缓存三个MAP)
  • 初始化 imitMethod destory(AOP在初始化之后动态代理实现)
  • BeanNameAware BeanClassLoaderAware BeanFactoryAware…
  • 放到单例池(一级缓存)put -> Map<key,value> key:bean的名字

bean工厂后置属性,两个扩展点

用于集成spring框架

  • BeanFactoryPostProcessor
    修改bean定义
    public class TestBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            // 获得bean定义
            GenericBeanDefinition user = (GenericBeanDefinition) beanFactory.getBeanDefinition("User");
            // 修改
            user.setBeanClassName("com.zwq.test.User");
        }
    }
  • BeanDefinitionRegistryPostProcessor
    注册bean
    public class TestBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    	
    }
    spring除了IOC,其余都是通过扩展节点实现

  目录