spring-bean-load

76 阅读3分钟

spring_load_bean

主要的类

BeanDefination

描述spring Bean的配置信息,主要的配置方式:xml,java注解,JavaConfig;

spring_BeanDefinition.jpeg

SpringBean的配置信息经过解析转换为BeanDefinition.不同的配置方式有不同的实现类

BeanDefinationRegistry

BeanDefinition的容器。保存配置信息(不是单例).Spring提供了扩展机制,允许用户在Spring框架启动时,动态地往BeanDefinitionRegistry容器中注册BeanDefinition对象。

BeanFactory

BeanFactory是Spring的Bean工厂,负责Bean的创建及属性注入。它同时是一个Bean容器,Spring框架启动后,会根据BeanDefinition对象创建Bean实例,所有的单例Bean都会注册到BeanFactory容器中.

BeanFactoryPostProcessor

BeanFactory的扩展接口..可以修改Bean的配置信息如BeanDefinition,BeanDefinitionRegistry..

xml和spring自己使用

@FunctionalInterface
public interface BeanFactoryPostProcessor {
    // 修改BeanFactory的信息
    void postProcessBeanFactor(ConfigurableListableBeanFactory var1) throws BeansException;
}

ImportBeanDefinitionRegistory

解析@Configuration注解时,通过ImportBeanDefinitionRegistrar接口的实现类向BeanDefinitionRegistry添加BeanDefinition信息.

public interface ImportBeanDefinitionRegistrar {
    // 解析@Configuration时调用
    // AnnotationMetadata是@import注解配置的信息
    void registerBeanDefinitions(AnnotationMetadata var1, BeanDefinitionRegistry var2);
}

BeanPostProcessor

Bean初始化方法(init_method)调用前后执行的方法..

public interface BeanPostProcessor {
    @Nullable
    default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Nullable
    default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

ClassPathBeanDefinitionScanner

ClassPathBeanDefinitionScanner是BeanDefinition扫描器,能够对指定包下的Class进行扫描,将Class信息转换为BeanDefinition对象注册到BeanDefinitionRegistry容器中。 ClassPathBeanDefinitionScanner支持自定义的过滤规则(扫描bean的基本规则....)

FactoryBean

FctoryBean是Spring中的工厂Bean,通常用于处理Spring中配置较为复杂或者由动态代理生成的Bean实例。实现了该接口的Bean不能作为普通的Bean使用,而是作为单个对象的工厂。当我们通过Bean名称获取FactoryBean实例时,获取到的并不是FactoryBean对象本身,而是FactoryBean对象的getObject()方法返回的实例。

spring_bean 启动过程

Spring_BeanRegistry.jpeg

  1. 对所有Bean的配置信息进行解析,其中包括XML配置文件、Java注解以及Java Config方式配置的Bean。将Bean的配置信息转换为BeanDefinition对象,注册到BeanDefinitionRegistry容器中。

  2. 从BeanDefinitionRegistry容器中获取实现了BeanFactoryPostProcessor接口的Bean定义,然后实例化Bean,调用所有BeanFactoryPostProcessor对象的postProcessBeanFactory()方法,在postProcessBeanFactory()方法中可以对Bean工厂的信息进行修改。

  3. 根据BeanDefinitionRegistry容器中的BeanDefinition对象实例化所有的单例Bean,并对Bean的属性进行填充。

  4. 执行所有实现了BeanPostProcessor接口的Bean的postProcessBeforeInitialization()方法。该方法中可以对原始的Bean进行包装。

  5. 执行Bean的初始化方法,初始化方法包括配置Bean时通过init-method属性指定的方法,或者通过实现InitializingBean接口重写的afterPropertiesSet()方法

  6. 执行所有实现了BeanPostProcessor接口的Bean的postProcessAfterInitialization()方法。

Mybatis-spring加载bean的过程

mybatis-spring把Mapper接口的代理对象注入到Spring容器.

mybatis与spring的Bean结合的过程

mybtais与Spring事务结合的过程

Dubbo-spring加载的过程