Spring源码剖析——DefaultListableBeanFactory

SpringFramework源码剖析——DefaultListableBeanFactory

大家都知道Spring框架主要提供了IoC与AOP两种能力,而IoC能力主要涉及到Bean的注册,AOP更多的是与上下文相关的配置。Bean的注册主要由BeanFactory负责,而ApplicationContext则负责程序完整上下文管理,从继承关系也可以看出来ApplicationContext是BeanFactory的超集,ApplicationContext是BeanFactory功能的拓展。

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
    @Nullable
    String getId();

    String getApplicationName();

    String getDisplayName();

    long getStartupDate();

    @Nullable
    ApplicationContext getParent();

    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

BeanFactory

官网介绍:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-beanfactory

官网介绍

官网介绍
总结:

  1. BeanFactory是IoC的基础,DefaultListableBeanFactory是关键的实现(看DefaultListableBeanFactory就行了)
  2. BeanFactory与其他组件交互主要通过 BeanFactoryAware, InitializingBean, DisposableBean这些类
  3. 底层BeanFactory不会感知配置的方式(通过xml还是注解来实现配置),配置的感知由拓展类(XmlBeanDefinitionReader 、AutowiredAnnotationBeanPostProcessor)实现。

DefaultListableBeanFactory源码

从DefaultListableBeanFactory开始,整个继承关系如下:
DefaultListableBeanFactory继承关系
各个类、接口功能大概描述一下:
AliasRegistry:别名注册接口,定义别名增删改查动作
SimpleAliasRegistry:管理一个aliasMap,注册别名
SingletonBeanRegistry:定义单例的注册获取相关动作
DefaultSingletonBeanRegistry:SingletonBeanRegistry的最简单实现,实现了单例bean的注册,著名的三层缓存解决循环依赖在源码中也有体现。

@Nullable
    protected Object getSingleton(String beanName, boolean allowEarlyReference) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                synchronized(this.singletonObjects) {
                    singletonObject = this.singletonObjects.get(beanName);
                    if (singletonObject == null) {
                        singletonObject = this.earlySingletonObjects.get(beanName);
                        if (singletonObject == null) {
                            ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
                            if (singletonFactory != null) {
                                singletonObject = singletonFactory.getObject();
                                this.earlySingletonObjects.put(beanName, singletonObject);
                                this.singletonFactories.remove(beanName);
                            }
                        }
                    }
                }
            }
        }

        return singletonObject;
    }

BeanFactory:BeanFactory的基本定义,特殊前缀 FACTORY_BEAN_PREFIX = “&”;
FactoryBeanRegistrySupport:继承DefaultSingletonBeanRegistry,实际上也是一个单例的注册器,只不过是针对FactoryBean特殊处理的,维护一个factoryBeanObjectCache的Map
ConfigurableBeanFactory:提供了配置化Bean的实现,在HierarchicalBeanFactory, SingletonBeanRegistry基础上,增加了SCOPE类型(singleton\prototype),增加了Bean的额外的配置信息
AutowireCapableBeanFactory:提供了自动装配Bean的实现,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。
ListableBeanFactory:提供了一系列枚举Bean的方法,比如根据Type把相关的Bean列出来、根据Annotation把相关Bean列出来等。
ConfigurableListableBeanFactory:整合ConfigurableBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory。
AbstractBeanFactory:支持管理FactoryBean与通过配置的方式注册的Bean的抽象类。
AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory与实现了AutowireCapableBeanFactory接口,支持管理通过autowire自动装配注册的bean与配置方式注册的Bean。
DefaultListableBeanFactory:spring中最基础的BeanFactory实现类,官方API描述:Spring’s default implementation of the ConfigurableListableBeanFactory and BeanDefinitionRegistry interfaces: a full-fledged bean factory based on bean definition metadata, extensible through post-processors.

关键代码
resolveBean方法:根据Type获取对应的NameBean实例
private <T> T resolveBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) {
        NamedBeanHolder<T> namedBean = this.resolveNamedBean(requiredType, args, nonUniqueAsNull);//先本Factory处理
        if (namedBean != null) {
            return namedBean.getBeanInstance();//若本Factory含有对应name的bean,则直接返回
        } else {
            BeanFactory parent = this.getParentBeanFactory();//若没有,则从parentFactory找
            if (parent instanceof DefaultListableBeanFactory) {
                return ((DefaultListableBeanFactory)parent).resolveBean(requiredType, args, nonUniqueAsNull);//如果parent依然是DefaultListableBeanFactory默认实现,则继续调用resolveBean方法递归
            } else if (parent != null) {
                ObjectProvider<T> parentProvider = parent.getBeanProvider(requiredType);//若parent不是默认的DefaultListableBeanFactory,则需要从BeanProvider列表中找到对用的BeanProvider
                if (args != null) {
                    return parentProvider.getObject(args);//若args不为空,则直接调用provider的getObject方法
                } else {
                    return nonUniqueAsNull ? parentProvider.getIfUnique() : parentProvider.getIfAvailable();//getBean传入nonUniqueAsNull为false,说明如果有多个实例,不会抛异常,可以根据某些条件返回,提供更宽松的注入方式
                }
            } else {
                return null;
            }
        }
    }
@Nullable
    private <T> NamedBeanHolder<T> resolveNamedBean(ResolvableType requiredType, @Nullable Object[] args, boolean nonUniqueAsNull) throws BeansException {
        Assert.notNull(requiredType, "Required type must not be null");
        String[] candidateNames = this.getBeanNamesForType(requiredType);//根据class找到所有已加载的Bean,包括继承关系、实现等,具体可看doGetBeanNamesForType方法,关键方法isTypeMatch,底层调用Class.isAssignableFrom本地方法
        String[] var6;
        int var7;
        int var8;
        String beanName;
        if (candidateNames.length > 1) {
            List<String> autowireCandidates = new ArrayList(candidateNames.length);
            var6 = candidateNames;
            var7 = candidateNames.length;

            for(var8 = 0; var8 < var7; ++var8) {
                beanName = var6[var8];
                if (!this.containsBeanDefinition(beanName) || this.getBeanDefinition(beanName).isAutowireCandidate()) {
                    autowireCandidates.add(beanName);
                }
            }
			//优先选取autowire方式加载的Bean
            if (!autowireCandidates.isEmpty()) {
                candidateNames = StringUtils.toStringArray(autowireCandidates);
            }
        }
		//若候选Bean长度为1,则直接返回
        if (candidateNames.length == 1) {
            String beanName = candidateNames[0];
            return new NamedBeanHolder(beanName, this.getBean(beanName, requiredType.toClass(), args));
        } else {
            if (candidateNames.length > 1) {
                Map<String, Object> candidates = CollectionUtils.newLinkedHashMap(candidateNames.length);
                var6 = candidateNames;
                var7 = candidateNames.length;

                for(var8 = 0; var8 < var7; ++var8) {
                    beanName = var6[var8];
                    //如果是单例,则判断是否为空,获取实例塞进候选实例map
                    if (this.containsSingleton(beanName) && args == null) {
                        Object beanInstance = this.getBean(beanName);
                        candidates.put(beanName, beanInstance instanceof NullBean ? null : beanInstance);
                    } else {
                    //否则直接根据BeanName获取实例塞进map
                        candidates.put(beanName, this.getType(beanName));
                    }
                }
				//
                String candidateName = this.determinePrimaryCandidate(candidates, requiredType.toClass());//调用getMergedLocalBeanDefinition合并bean的parent所有属性,判断是否配置为primary,如果有设置primary则优先使用,若有多个primary则抛异常
                if (candidateName == null) {
                    candidateName = this.determineHighestPriorityCandidate(candidates, requiredType.toClass());//若不存在primary,则根据priority查找优先级最高的
                }

                if (candidateName != null) {
                    Object beanInstance = candidates.get(candidateName);
                    if (beanInstance == null || beanInstance instanceof Class) {
                        beanInstance = this.getBean(candidateName, requiredType.toClass(), args);
                    }

                    return new NamedBeanHolder(candidateName, beanInstance);
                }

                if (!nonUniqueAsNull) {
                    throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet());
                }
            }

            return null;
        }
    }
createBean方法:初始化生成bean实例过程
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
        if (this.logger.isTraceEnabled()) {
            this.logger.trace("Creating instance of bean '" + beanName + "'");
        }

        RootBeanDefinition mbdToUse = mbd;
        Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);//根据beanName获取bean的class,可能存在继承关系需要逐层解析
        if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
            mbdToUse = new RootBeanDefinition(mbd);
            mbdToUse.setBeanClass(resolvedClass);
        }

        try {
            mbdToUse.prepareMethodOverrides();//如有涉及方法重载,则把方法的overloaded属性设置为false
        } catch (BeanDefinitionValidationException var9) {
            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var9);
        }

        Object beanInstance;
        try {
        //执行InstantiationAwareBeanPostProcessor,执行完后,bean对象已经实例化好,但未初始化
            beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
            //若有代理,则直接返回代理对象
            if (beanInstance != null) {
                return beanInstance;
            }
        } catch (Throwable var10) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var10);
        }
        
        try {
        	//调用doCreateBean创建Bean实例,涉及到SmartInstantiationAwareBeanPostProcessor可以拓展
            beanInstance = this.doCreateBean(beanName, mbdToUse, args);
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("Finished creating instance of bean '" + beanName + "'");
            }

            return beanInstance;
        } catch (ImplicitlyAppearedSingletonException | BeanCreationException var7) {
            throw var7;
        } catch (Throwable var8) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", var8);
        }
    }

关键方法:this.resolveBeforeInstantiation(beanName, mbdToUse),调用注册的所有InstantiationAwareBeanPostProcessor,分别在实例化前与实例化后执行一个回调方法,感知bean实例化,实现注入、返回代理对象等(AOP)操作。
实现AOP关键代码:

public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
        Object cacheKey = this.getCacheKey(beanClass, beanName);
        if (!StringUtils.hasLength(beanName) || !this.targetSourcedBeans.contains(beanName)) {
            if (this.advisedBeans.containsKey(cacheKey)) {
                return null;
            }

            if (this.isInfrastructureClass(beanClass) || this.shouldSkip(beanClass, beanName)) {
                this.advisedBeans.put(cacheKey, Boolean.FALSE);
                return null;
            }
        }

        TargetSource targetSource = this.getCustomTargetSource(beanClass, beanName);
        if (targetSource != null) {
            if (StringUtils.hasLength(beanName)) {
                this.targetSourcedBeans.add(beanName);
            }
			//根据beanName与beanClass获取所有的advice
            Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);
            //创建proxy并返回
            Object proxy = this.createProxy(beanClass, beanName, specificInterceptors, targetSource);
            this.proxyTypes.put(cacheKey, proxy.getClass());
            return proxy;
        } else {
            return null;
        }
    }
initializeBean方法
protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
        if (System.getSecurityManager() != null) {
            AccessController.doPrivileged(() -> {
                this.invokeAwareMethods(beanName, bean);
                return null;
            }, this.getAccessControlContext());
        } else {
        	//执行BeanFactory注册的Aware方法——这也是个比较重要的特性
            this.invokeAwareMethods(beanName, bean);
        }

        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
        	//调用注册的BeanProcessor的初始化前方法:postProcessBeforeInitialization
            wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
        }

        try {
        	//执行定义的Init方法
            this.invokeInitMethods(beanName, wrappedBean, mbd);
        } catch (Throwable var6) {
            throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
        }

        if (mbd == null || !mbd.isSynthetic()) {
        	//调用注册的BeanProcessor的初始化后方法:postProcessAfterInitialization
            wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

        return wrappedBean;
    }
invokeAwareMethods方法:通过实现接口,spring自动识别向bean中注入beanName\beanFactory等
private void invokeAwareMethods(String beanName, Object bean) {
        if (bean instanceof Aware) {
            if (bean instanceof BeanNameAware) {
                ((BeanNameAware)bean).setBeanName(beanName);
            }

            if (bean instanceof BeanClassLoaderAware) {
                ClassLoader bcl = this.getBeanClassLoader();
                if (bcl != null) {
                    ((BeanClassLoaderAware)bean).setBeanClassLoader(bcl);
                }
            }

            if (bean instanceof BeanFactoryAware) {
                ((BeanFactoryAware)bean).setBeanFactory(this);
            }
        }

    }
BeanPostProcessorCache类

在AbstractBeanFactory里面有一个Cache类,里面缓存了多种BeanPostProcessor,Spring中BeanFactory的灵活拓展正是通过BeanPostProcessor实现

static class BeanPostProcessorCache {
        final List<InstantiationAwareBeanPostProcessor> instantiationAware = new ArrayList();
        final List<SmartInstantiationAwareBeanPostProcessor> smartInstantiationAware = new ArrayList();
        final List<DestructionAwareBeanPostProcessor> destructionAware = new ArrayList();
        final List<MergedBeanDefinitionPostProcessor> mergedDefinition = new ArrayList();

        BeanPostProcessorCache() {
        }
    }

总结

杂七杂八的写了挺多的,感觉看完DefaultListableBeanFactory这个类之后对Spring框架对Bean的加载过程有了比较深刻的理解,之前看过一些文章提到的Bean生命周期、BeanPostProcessor的执行、AOP实现的原理等在上文都有一丢丢的体现。以上纯属个人理解,如有错误欢迎指出交流,看完一遍后感觉有了大概了雏形,如果要有更深刻的理解可能得多读几遍源码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值