SpringIOC源码解析(2)—— 简单容器

190 阅读2分钟

首先要明确两点:

  1. 所有的IOC接口都要实现接口BeanFactory。
  2. IOC容器的设计主要分为两个主要路线:BeanFactoryApplicationContext分别为核心。

BeanFactory 和 FactoryBean 的区别

  • 前者是spring的根接口,定义了Bean工厂最基础的功能特性,是一个Factory
  • 后者是用来生成普通的bean,实现了这个接口之后,spring会在容器初始化时会把实现了这个接口的bean取出来,然后通过getObject()方法来生成bean。(根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身, 如果要获取FactoryBean对象,可以在id前面加一个&符号来获取)
<bean id="userFactoryBean" class="com.wjw.entity.factory.UserFactoryBean"/>
// 根据FactoryBean创建的对象
User user4a = (User) applicationContext.getBean("userFactoryBean");
User user4b = (User) applicationContext.getBean("userFactoryBean");
System.out.println("FactoryBean创建的对象:" + user4a);
System.out.println("FactoryBean创建的对象:" + user4b);

上面代码获取到的是User对象

请添加图片描述

加上转义字符FACTORY_BEAN_PREFIX = "&"

UserFactoryBean user4a = (UserFactoryBean) applicationContext.getBean("&userFactoryBean");
UserFactoryBean user4b = (UserFactoryBean) applicationContext.getBean("&userFactoryBean");
System.out.println("FactoryBean创建的对象:" + user4a);
System.out.println("FactoryBean创建的对象:" + user4b);

打印的就是UserFactoryBean对象

BeanFactory源码

上面提到的转义字符&: 请添加图片描述请添加图片描述 请添加图片描述 @Autowired按类型获取实例,@Qualifier支持按名字获取实例,最终都是调用的这些方法。

请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 可以看到BeanFactory只对IOC容器的基本行为做了定义,并不关心是怎么生成bean的。

BeanFactory家族体系

请添加图片描述

根据单一职责原则,较顶层的接口一般都实现了单一职责。


ListableBeanFactory该接口可以以列表的方式提供bean的相关信息,特点是可以批量列出工厂生产的实例的信息。 请添加图片描述 请添加图片描述 请添加图片描述


AutowireCapableBeanFactory该类可以填充那些不受Spring控制的类,实现了这个接口的,诸如AbstractAutowireCapableBeanFactory便可以使用其autowireBean方法中的populateBean方法来装配特定的Spring Bean实例来满足业务需求。

请添加图片描述 一般在代码中不建议直接使用这个接口

在代码中一般直接使用@Autowired注解,这个注解最终调用的还是AutowireCapableBeanFactoryresolveDependency方法来实现的依赖注入,AutowireCapableBeanFactory定义了三种装配策略: 请添加图片描述


ConfigurableBeanFactory

请添加图片描述 请添加图片描述 请添加图片描述 请添加图片描述 该接口继承了SingletonBeanRegistry,所以也具备向容器注册单例实例的功能。


ConfigurableListableBeanFactory接口继承了BeanFactory体系的所有二级接口(集大成者),包含该体系的所有方法,还加入了忽略自动装配等10个方法 请添加图片描述


DefaultListableBeanFactory最主要是实现了BeanDefinitionRegistry,是BeanDefinition注册的重点

一个最重要的属性,存储spring中对bean的定义和描述:BeanDefinition

请添加图片描述

其他术语

  • 组件扫描:自动发现应用容器中需要创建的Bean
    • 找出被Controller、Service、Repository等注解标签标记的bean
  • 自动装配:自动满足Bean之间的依赖