spring源码阅读(1)IOC与BeanFactory

Posted by New Boy on January 9, 2020

前言

(以下分析均基于spring-5.1.8)

因为spring这个框架在日常工作中的应用实在是太广泛了,便决定下一个阶段学学spring。因为spring非常庞大,一时不知道怎么下手,向hzk咨询了下,决定先看spring的官方文档,再结合相关书籍资料去读源码。spring虽然已经从springmvc到springboot,但核心还是spring-core,spring-context,spring-beans,spring-aop这些。

所以这一阶段的学习主要是针对ioc和aop的学习。另外希望能从源码的角度找到部分问题的答案:

1.spring bean的生命周期是怎么样的?

2.spring是如何解决循环依赖的?

3.如何对spring进行扩展

4.spring对aop的实现方式

IOC

spring作为一个bean的容器,其最基本的功能就是IOC(控制反转),其中也主要包含了两部分:依赖查找和依赖注入,打个比方,一个大的项目中会有非常多的对象(单例或多例),各个对象间还会有依赖,如果没有spring给我们管理,特别是程序员水平不一的情况下,很可能会导致项目越来越复杂,维护成本越来越高。IOC正是帮我很好的解决了各个对象间依赖的问题,让大家更关注于业务本身。

而管理bean的正是我们接下来要看的BeanFactory

总的来说,sping从启动开始,bean主要有两个过程:

bean的解析与注册

无论是早起的解析xml配置,还是通过component-scan的方式,其目的就是将类转换成AbstractBeanDefinition并添加到spring的中

bean的实例化和初始化

实例化就是new一个对象,并把其所依赖的对象,属性字段也注入进去。其主要的过程就是将上一步中生成的BeanDefinition转换成实例对象

BeanFactory总体架构

先上一张BeanFactory的依赖图,最上层的类便是 DefaultListableBeanFactory:

第一眼看会觉得BeanFacory的体系非常复杂,而且部分类中的代码也是非常得长,还是得先仔细看看相关的接口

AliasRegistry

其中就四个方法,均是别名相关

	void registerAlias(String name, String alias);
	void removeAlias(String alias);
	boolean isAlias(String name);
	String[] getAliases(String name);

BeanDefinitionRegistry

void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;
void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

boolean containsBeanDefinition(String beanName);

String[] getBeanDefinitionNames();

int getBeanDefinitionCount();

boolean isBeanNameInUse(String beanName);

这个接口也比较好理解,都是针对BeanDefinition的“增删查”操作

以上两个接口是bean的解析与注册相关,再来看看bean的实例化与初始化

BeanFactory

最基本的接口,BeanFactory之于spring就如同chuck berry之于摇滚

忽略重载,其中主要是以下几个接口

//根据条件(比如名称,类名等)找到对应的bean实例
Object getBean(...);
//查找对应的ObjectProvider
ObjectProvider<T> getBeanProvider(...);
//是否存在bean
boolean containsBean(String name);
//是否为单例
boolean isSingleton(String name);
//是否为多例
boolean isPrototype(String name);
//名称和类是否匹配
boolean isTypeMatch(String name, Class<?> targetType)
//根据bean的名称获取bean的别名
String[] getAliases(String name);
//根据名称获取class类型
Class<?> getType(String name);

除了其中ObjectProvider是4.3才引进来的,其余的都好理解。ObjectProvider继承自ObjectFactory,我理解是给了使用者更大的自由度来决定注入的Bean,特别是在存在多个同类型的bean时。

ListableBeanFactory

大致的接口如下:

boolean containsBeanDefinition(String beanName);
//查询beanDefinition总数
int getBeanDefinitionCount();
String[] getBeanDefinitionNames();
//根据
String[] getBeanNamesForType();
<T> Map<String, T> getBeansOfType();
String[] getBeanNamesForAnnotation();
  Map<String, Object> getBeansWithAnnotation();
<A extends Annotation> A findAnnotationOnBean()

正如Listable所表示,这些接口会用于列出bean以及beanDefinition

###HierarchicalBeanFactory

//拿到父工厂
BeanFactory getParentBeanFactory();
//当前工厂是否含有bean
boolean containsLocalBean(String name);

###AutowireCapableBeanFactory

和HierarchicalBeanFactory,ListableBeanFactory一样,该接口也只继承了BeanFactory接口。但相较于另外两个,这个会复杂很多


//-------------------------------------------------------------------------
// Typical methods for creating and populating external bean instances
//-------------------------------------------------------------------------
//根据类名创建bean
<T> T createBean(Class<T> beanClass) throws BeansException;
//重新装配一个bean对象(existingBean)
void autowireBean(Object existingBean) throws BeansException;
//会重新实例化一个beanName类型的对象(existingBean)
Object configureBean(Object existingBean, String beanName) throws BeansException;


//-------------------------------------------------------------------------
// Specialized methods for fine-grained control over the bean lifecycle
//-------------------------------------------------------------------------

//创建bean
Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
//自动装配bean的相关参数
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;
//自动装配bean的相关参数
void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
  throws BeansException;
//自动装配bean的相关参数
void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;
//初始化一个bean
Object initializeBean(Object existingBean, String beanName) throws BeansException;

//初始化之前执行BeanPostProcessors
Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
  throws BeansException;

//初始化之后执行BeanPostProcessors
Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
  throws BeansException;

void destroyBean(Object existingBean);


//-------------------------------------------------------------------------
// Delegate methods for resolving injection points
//-------------------------------------------------------------------------

<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;

Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException;

@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;
//依赖查找
@Nullable
Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName, @Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;

这个接口主要包含了两部分内容:

1.创建以及组装bean实例相关的接口

2.进行依赖查找的接口,就比如项目中常常用到Autowird注解和Value注解,在自动装配bean的相关参数时就会调用AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues方法进行依赖查找以及对象的注入,当然这个后续会具体去看看

SingletonBeanRegistry

void registerSingleton(String beanName, Object singletonObject);
@Nullable
Object getSingleton(String beanName);
boolean containsSingleton(String beanName);
String[] getSingletonNames();
int getSingletonCount();
//返回所有的单例类
Object getSingletonMutex();

SingletonBeanRegistry也是最底层的接口,它实现的是所有单例类的添加,查找功能,比较简单明了,但很重要,主要就是在操作存放单例类的map

###ConfigurableBeanFactory

ConfigurableBeanFactory继承了HierarchicalBeanFactory和SingletonBeanRegistry,其中方法非常多,就不再列举了,涉及的点非常多,包括父工厂相关,类加载器相关,属性解析器相关,Bean后处理器相关,bean别名相关,FactoryBean相关等等。

ConfigurableListableBeanFactory

ConfigurableListableBeanFactory继承了AutowireCapableBeanFactory和ConfigurableBeanFactory和ListableBeanFactory,新增的部分接口也不在此一一列举了

总结

至此,BeanFactory相关的架构,相关比较重要的接口也写完了。总的来说,接口非常多,但仔细看,还是可以发现各个接口各司其职,井井有条