spring源码学习---Sping ioc 依赖来源

      依赖来源主要包括:依赖查找的来源和 依赖注入的来源。其中依赖注入的来源比依赖查找来源多一个非Spring 容器管理对象(也可以叫游离对象)

一、依赖查找的来源

1.1、Spring BeanDefinition 和单例对象

spring源码学习---Sping ioc 依赖来源_第1张图片

1.2、Spring 內建BeanDefintion

spring源码学习---Sping ioc 依赖来源_第2张图片

1.3、Spring 內建单例对象

spring源码学习---Sping ioc 依赖来源_第3张图片

二、依赖注入来源

   依赖注入的来源包括 自定义Spring BeanDefinition 、单例对象、Spring 內建BeanDefintion、Spring 內建单例对象以及Spring 容器管理对象(也可以叫游离对象)

spring源码学习---Sping ioc 依赖来源_第4张图片

Spring容器管理和游离对象
spring源码学习---Sping ioc 依赖来源_第5张图片

三 、Spring IOC的三种依赖来源

     Spring IOC的三种依赖来源,自定义注册的Spring bean、内建的Spring bean以及内建的可注入的依赖,其中自定义注册的Spring bean基本上是通过xml、注解或者api注册BeanDefination创建的,内建的Spring bean是通过registerSingleton()创建的,内建的可注入的依赖是通过registerResolveDependency()创建的,后续如果我们需要往Spring容器里放入一些非Spring托管的bean但又可以被依赖注入的, 可以通过registerResolveDependency() API实现。

3.1 Spring BeanDefinition 作为依赖来源

要素
    • 元数据:BeanDefinition
    • 注册:BeanDefinitionRegistry#registerBeanDefinition
       用来注册bean
    • 类型:延迟和非延迟
    • 顺序:Bean 生命周期顺序按照注册顺序

3.2 单例对象作为依赖来源

•要素
    • 来源:外部普通 Java 对象(不一定是 POJO)
    • 注册:SingletonBeanRegistry#registerSingleton
• 限制
    • 无生命周期管理
    • 无法实现延迟初始化 Bean

3.3  非 Spring 容器管理对象作为依赖来源

•要素
    • 注册:ConfigurableListableBeanFactory#registerResolvableDependency
• 限制
    • 无生命周期管理
    • 无法实现延迟初始化 Bean
    • 无法通过依赖查找

/**
 * ResolvableDependency 作为依赖来源
 *
 * 
 * @since
 */
public class ResolvableDependencySourceDemo {

    @Autowired
    private String value;

    @PostConstruct
    public void init() {
        System.out.println(value);
    }

    public static void main(String[] args) {

        // 创建 BeanFactory 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

        // 注册 Configuration Class(配置类) -> Spring Bean
        applicationContext.register(ResolvableDependencySourceDemo.class);

        applicationContext.addBeanFactoryPostProcessor(beanFactory -> {
            // 注册 Resolvable Dependency
            beanFactory.registerResolvableDependency(String.class, "Hello,World");
        });

        // 启动 Spring 应用上下文
        applicationContext.refresh();

        // 显示地关闭 Spring 应用上下文
        applicationContext.close();
    }

}

总结:注册非spring管理的依赖对象时,可以通过两种方式实现
1.通过ApplicationContext.getBeanFactory()获取AnnotationConfigApplicationContext创建时初始化的DefaultListableBeanFactory对象,然后调用registryResolveableDependency来注册

2.通过addBeanFactoryPostProcessor回调方式实现,因为当refresh()方法执行invokeBeanFactoryPostProcessors()时会遍历已创建的beanFactoryPostProcessors集合对象来执行postProcessBeanFactory()方法

你可能感兴趣的:(spring源码学习)