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

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

一、依赖查找的来源

1.1、Spring BeanDefinition 和单例对象

1.2、Spring 內建BeanDefintion

1.3、Spring 內建单例对象

二、依赖注入来源

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

Spring容器管理和游离对象

三 、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()方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值