美文网首页
spring 系列:spring IOC之BeanDefinit

spring 系列:spring IOC之BeanDefinit

作者: 仿若尘土 | 来源:发表于2022-11-02 23:29 被阅读0次

    1. 背景

    在IOC前需搞清楚Spring容器,以及为什么需要Spring容器。

    通常来说,使用容器运行组件,除了提供一个组件运行环境之外,容器还提供了许多底层服务。例如,Servlet容器底层实现了TCP连接,解析HTTP协议等非常复杂的服务,如果没有容器来提供这些服务,我们就无法编写像Servlet这样代码简单,功能强大的组件。早期的JavaEE服务器提供的EJB容器最重要的功能就是通过声明式事务服务,使得EJB组件的开发人员不必自己编写冗长的事务处理代码,所以极大地简化了事务处理。
    Spring的核心就是提供了一个IoC容器,它可以管理所有轻量级的JavaBean组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP支持,以及建立在AOP基础上的声明式事务服务等。
    参考 IoC容器

    2. 使用

    2.1 基于XML

    bean定义:

    public class FirstBean {
        public void hello() {
            System.out.println("hello world");
        }
    }
    

    XML定义:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean name="firstBean" class="com.cui.study.spring.FirstBean"/>
    </beans>
    

    类加载和使用:

    public class Main {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
            FirstBean firstBean = context.getBean("firstBean", FirstBean.class);
            firstBean.hello();
        }
    }
    

    2.2 基于注解的方式

    bean定义:

    @Component
    public class FirstBean {
        public void hello() {
            System.out.println("hello world");
        }
    }
    

    类加载和使用:

    @ComponentScan(value = "com.cui.study.spring")
    public class Main {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
            FirstBean firstBean = context.getBean("firstBean", FirstBean.class);
            firstBean.hello();
        }
    }
    

    3. 核心源码解析

    Spring 容器初始化核心流程在AbstractApplicationContext#refresh方法中(版本为spring-context-5.3.23):

    public void refresh() throws BeansException, IllegalStateException {
            synchronized (this.startupShutdownMonitor) {
                StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
    
                // Prepare this context for refreshing.
                            // 容器初始化前准备,如设置容器状态、初始化监听器和事件列表等
                prepareRefresh();
    
                // Tell the subclass to refresh the internal bean factory.
                // 核心流程:初始化容器,并解析xml、注解中的BeanDefinition列表
                ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    
                // Prepare the bean factory for use in this context.
                // 配置工厂类的标准化特征,如ClassLoader and post-processors.
                prepareBeanFactory(beanFactory);
    
                try {
                    // Allows post-processing of the bean factory in context subclasses.
                    // 容器初始化,并加载BeanDefinition后,修改容器
                    postProcessBeanFactory(beanFactory);
    
                    StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
                    // Invoke factory processors registered as beans in the context.
                    // 初始化 BeanFactoryPostProcessor 扩展点(容器扩展点),并执行
                    invokeBeanFactoryPostProcessors(beanFactory);
    
                    // Register bean processors that intercept bean creation.
                    // 创建并注册 BeanPostProcessor(Bean扩展点)
                    registerBeanPostProcessors(beanFactory);
                    beanPostProcess.end();
    
                    // Initialize message source for this context.
                    // 初始化MessageSource,用于国际化
                    initMessageSource();
    
                    // Initialize event multicaster for this context.
                    // 初始化 ApplicationEventMulticaster
                    initApplicationEventMulticaster();
    
                    // Initialize other special beans in specific context subclasses.
                    //子容器扩展点,初始化其他特殊的bean
                    onRefresh();
    
                    // Check for listener beans and register them.
                    // 注册 listener bean
                    registerListeners();
    
                    // Instantiate all remaining (non-lazy-init) singletons.
                    // 核心流程:初始化所有剩余的非延迟初始化的单例bean
                    finishBeanFactoryInitialization(beanFactory);
    
                    // Last step: publish corresponding event.
                    // 容器初始化结束,清理缓存,初始化并执行LifecycleProcessor#onRefresh,发送ContextRefreshedEvent事件
                    finishRefresh();
                }
    
                catch (BeansException ex) {
                    if (logger.isWarnEnabled()) {
                        logger.warn("Exception encountered during context initialization - " +
                                "cancelling refresh attempt: " + ex);
                    }
    
                    // Destroy already created singletons to avoid dangling resources.
                    destroyBeans();
    
                    // Reset 'active' flag.
                    cancelRefresh(ex);
    
                    // Propagate exception to caller.
                    throw ex;
                }
    
                finally {
                    // Reset common introspection caches in Spring's core, since we
                    // might not ever need metadata for singleton beans anymore...
                    resetCommonCaches();
                    contextRefresh.end();
                }
            }
        }
    

    4. 基于XML方式的BeanDefinition解析

    基于XML的解析方式,在刷新容器时解析BeanDefinition,核心步骤主要分为以下几个步骤:

    1. 容器刷新时解析BeanDefinition
    2. 容器委托给XmlBeanDefinitionReader解析BeanDefinition
    3. XmlBeanDefinitionReader将XML解析成Document,并委托给BeanDefinitionDocumentReader解析;
    4. BeanDefinitionDocumentReader处理<beans>标签,解析出来的BeanDefinitionHolder注册到容器的beanDefinitionMap对象中。<bean>标签解析过程委托给BeanDefinitionParserDelegate
      4.1 BeanDefinitionParserDelegate具体解析<bean>标签,返回BeanDefinitionHolder

    4.1 容器刷新

    加载BeanDefinition的入口在AbstractRefreshableApplicationContext#loadBeanDefinitions中,具体逻辑在子类AbstractXmlApplicationContext里实现。调用链路如下:

    loadBeanDefinitions调用链路
    加载BeanDefinition委托给BeanDefinitionReader#loadBeanDefinitions方法,实现类为XmlBeanDefinitionReader

    4.2 XmlBeanDefinitionReader解析过程

    加载BeanDefinition委托过程
    真正注册BeanDefinition的操作在doLoadBeanDefinitions中实现。
    protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
                throws BeanDefinitionStoreException {
    // try,忽略
                    // 将XML转换成Document对象
            Document doc = doLoadDocument(inputSource, resource);
                    // 注册BeanDefinition,并返回注册BeanDefinition总数
            int count = registerBeanDefinitions(doc, resource);
            if (logger.isDebugEnabled()) {
                logger.debug("Loaded " + count + " bean definitions from " + resource);
            }
            return count;
    // catch处理,忽略
        }
    

    registerBeanDefinitions中最后委托给BeanDefinitionDocumentReader#registerBeanDefinitions

    4.3 BeanDefinitionDocumentReader解析过程

        public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
            BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
            int countBefore = getRegistry().getBeanDefinitionCount();
                    // 委托给BeanDefinitionDocumentReader的registerBeanDefinitions
            documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
            return getRegistry().getBeanDefinitionCount() - countBefore;
        }
    

    BeanDefinitionDocumentReader中的调用链路如下:

    BeanDefinitionDocumentReader加载BeanDefinition过程
    parseBeanDefinitions的实现细节如下:
    protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
            if (delegate.isDefaultNamespace(root)) {
                NodeList nl = root.getChildNodes();
                for (int i = 0; i < nl.getLength(); i++) {
                    Node node = nl.item(i);
                    if (node instanceof Element) {
                        Element ele = (Element) node;
                        if (delegate.isDefaultNamespace(ele)) {
                                                    // Spring提供的默认element解析,包括import、alias、bean、beans
                            parseDefaultElement(ele, delegate);
                        }
                        else {
                                                    // 自定义element解析(http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#xml-custom)
                            delegate.parseCustomElement(ele);
                        }
                    }
                }
            }
            else {
                delegate.parseCustomElement(root);
            }
        }
    

    最终在parseDefaultElement中解析XML中定义的importaliasbeanbeans

        private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
            if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
                importBeanDefinitionResource(ele);
            }
            else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
                processAliasRegistration(ele);
            }
            else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
                processBeanDefinition(ele, delegate);
            }
            else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
                // recurse
                doRegisterBeanDefinitions(ele);
            }
        }
    

    主要看对bean标签的处理,在方法processBeanDefinition中:

        protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
                    // 计算BeanDefinition,委托给BeanDefinitionParserDelegate实现真正的解析动作
            BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
            if (bdHolder != null) {
                bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
                try {
                    // Register the final decorated instance.
                    // 将BeanDefinition注册到容器的beanDefinitionMap中
                    BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
                }
                catch (BeanDefinitionStoreException ex) {
                    getReaderContext().error("Failed to register bean definition with name '" +
                            bdHolder.getBeanName() + "'", ele, ex);
                }
                // Send registration event.
                getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
            }
        }
    

    4.3.1 BeanDefinitionParserDelegate 解析过程

    BeanDefinitionParserDelegate中的实现逻辑如下:

    BeanDefinitionParserDelegate调用链路
    核心逻辑在parseBeanDefinitionElement中,解析结果为GenericBeanDefinition,解析的元素可参考[Spring官方文档]。(https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-autowired-annotation-qualifiers)
    public AbstractBeanDefinition parseBeanDefinitionElement(
                Element ele, String beanName, @Nullable BeanDefinition containingBean) {
    
            this.parseState.push(new BeanEntry(beanName));
    
            String className = null;
            if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
                className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
            }
            String parent = null;
            if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
                parent = ele.getAttribute(PARENT_ATTRIBUTE);
            }
    
            try {
                AbstractBeanDefinition bd = createBeanDefinition(className, parent);
                // 解析bean属性
                parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
                bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));
                // 解析meta标签
                parseMetaElements(ele, bd);
                // 解析lookup-method标签
                parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
                // 解析replaced-method标签
                parseReplacedMethodSubElements(ele, bd.getMethodOverrides());
                // 解析constructor-arg标签
                parseConstructorArgElements(ele, bd);
                // 解析property标签
                parsePropertyElements(ele, bd);
                // 解析qualifier标签
                parseQualifierElements(ele, bd);
    
                bd.setResource(this.readerContext.getResource());
                bd.setSource(extractSource(ele));
    
                return bd;
            }
            catch (ClassNotFoundException ex) {
                error("Bean class [" + className + "] not found", ele, ex);
            }
            catch (NoClassDefFoundError err) {
                error("Class that bean class [" + className + "] depends on not found", ele, err);
            }
            catch (Throwable ex) {
                error("Unexpected failure during bean definition parsing", ele, ex);
            }
            finally {
                this.parseState.pop();
            }
    
            return null;
        }
    

    5. 基于Annotation方式的BeanDefinition解析

    基于Annotation的方式借助BeanFactoryPostProcessor扩展类实现。核心实现逻辑如下:

    • 初始化AnnotationConfigApplicationContext时,初始化AnnotatedBeanDefinitionReader,在AnnotatedBeanDefinitionReader中注册ConfigurationClassPostProcessor,实际解析BeanDefinition解析在ConfigurationClassPostProcessor中完成;
    • AbstractApplicationContext#refresh初始化容器后,invokeBeanFactoryPostProcessors方法中调用容器后置处理器;
    • 容器委托给PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors处理,在委托类中调用postProcessor.postProcessBeanFactory执行容器后置处理器,其中包括ConfigurationClassPostProcessor,其优先级最低。在ConfigurationClassPostProcessor中处理配置类
    • ConfigurationClassPostProcessor委托给ConfigurationClassParser解析配置类列表中所有的BeanDefinition;解析结束后,递归遍历新解析BeanDefinition中的配置类
    • ConfigurationClassParser中遍历配置类,每个配置类委托给ComponentScanAnnotationParser实现具体的BeanDefinition解析动作
    • ComponentScanAnnotationParser创建ClassPathBeanDefinitionScanner,并计算待扫描路径basePackages,最后的解析动作委托给ClassPathBeanDefinitionScanner#doScan处理
    • ClassPathBeanDefinitionScanner找到所有配置类路径范围内包含@Component的类(@Service/@Repository/@Controller是特殊的@Component注解,也会被扫描),创建ScannedGenericBeanDefinition;委托AnnotationScopeMetadataResolver解析@Scope注解;解析通用注解,包括@Lazy@Primary@DependsOn@Role@Description;检测是否已注册,如果未注册则创建BeanDefinitionHolder,如果未注册完成注册

    5.1 AnnotationConfigApplicationContext初始化过程

    AnnotationConfigApplicationContext初始化过程如下:

        public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
                    // 初始化
            this();
                    // 注册入口配置类
            register(componentClasses);
                    // 创建并刷新容器
            refresh();
        }
    
        public AnnotationConfigApplicationContext() {
            StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
            // 初始化AnnotatedBeanDefinitionReader,注册注解相关的处理器
            this.reader = new AnnotatedBeanDefinitionReader(this);
            createAnnotatedBeanDefReader.end();
            // 初始化ClassPathBeanDefinitionScanner,注册默认注解过滤器,包括@Component
            this.scanner = new ClassPathBeanDefinitionScanner(this);
        }
    

    5.1.1 AnnotatedBeanDefinitionReader创建过程

    BeanDefinition解析中起到关键作用的功能是注册ConfigurationClassPostProcessor处理器:

        public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
            Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
            Assert.notNull(environment, "Environment must not be null");
            this.registry = registry;
            this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
            // 注册默认处理器
            AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
        }
    
    // 调用本地方法
    public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
            registerAnnotationConfigProcessors(registry, null);
        }
    
    public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
                BeanDefinitionRegistry registry, @Nullable Object source) {
    
            DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
            if (beanFactory != null) {
                if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
                    beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
                }
                if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
                    beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
                }
            }
    
            Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
    
    // 注册ConfigurationClassPostProcessor处理器,基于@Component、@Service、@Repository、@Controller 注解的BeanDefinition解析主要依赖该处理器
            if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
                RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
                def.setSource(source);
                beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
            }
    
    // 注册AutowiredAnnotationBeanPostProcessor处理器,后面@Autowired注入的bean主要依赖该处理器
            if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
                RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
                def.setSource(source);
                beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
            }
    
            // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
    // 注册CommonAnnotationBeanPostProcessor处理器,后面@Resource注入的bean主要依赖该处理器处理
            if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
                RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
                def.setSource(source);
                beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
            }
    
            // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.
    // 支持spring JPA
            if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
                RootBeanDefinition def = new RootBeanDefinition();
                try {
                    def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
                            AnnotationConfigUtils.class.getClassLoader()));
                }
                catch (ClassNotFoundException ex) {
                    throw new IllegalStateException(
                            "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
                }
                def.setSource(source);
                beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
            }
    // 注册EventListenerMethodProcessor,处理@EventListener注解的方法
            if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
                RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
                def.setSource(source);
                beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
            }
    // 注册DefaultEventListenerFactory,EventListener的默认处理器
            if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
                RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
                def.setSource(source);
                beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
            }
    
            return beanDefs;
        }
    

    5.1.2 ClassPathBeanDefinitionScanner创建过程

    对解析BeanDefinition起关键作用的功能是添加处理@Component注解的AnnotationTypeFilter过滤器,核心代码如下:

        protected void registerDefaultFilters() {
                    // 在includeFilters中添加Component过滤器,解析BeanDefinition时使用此处理器过滤
            this.includeFilters.add(new AnnotationTypeFilter(Component.class));
            ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
            try {
                this.includeFilters.add(new AnnotationTypeFilter(
                        ((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));
                logger.trace("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning");
            }
            catch (ClassNotFoundException ex) {
                // JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.
            }
            try {
                this.includeFilters.add(new AnnotationTypeFilter(
                        ((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));
                logger.trace("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");
            }
            catch (ClassNotFoundException ex) {
                // JSR-330 API not available - simply skip.
            }
        }
    
    

    5.2 AbstractApplicationContext#refresh容器刷新过程

    在容器刷新主流程中,加载基于AnnotationBeanDefinition解析过程在invokeBeanFactoryPostProcessors(beanFactory);中实现:

        protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
            // 解析动作委托给PostProcessorRegistrationDelegate处理
            PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
    
            // Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
            // (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
            if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
                beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
                beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
            }
        }
    

    5.3 PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors容器创建后置处理器处理过程

    PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors逻辑比较复杂,主要做了几件事(逻辑只包括BeanDefinitionRegistry容器,非BeanDefinitionRegistry较简单,可自行从else开始看):

    • 执行入参带入的BeanDefinitionRegistryPostProcessor#postProcessBeanDefinitionRegistry方法(BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor的子类,增加了postProcessBeanDefinitionRegistry扩展方法,用来注册新的BeanDefinition,注册新的BeanDefinition
    • 从容器中获取实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor,初始化,执行起postProcessBeanDefinitionRegistry方法注册新的BeanDefinition
    • 从容器中获取实现了Ordered的BeanDefinitionRegistryPostProcessor,初始化,执行起postProcessBeanDefinitionRegistry方法注册新的BeanDefinition
    • 从容器中获取实现了Ordered的BeanDefinitionRegistryPostProcessor,初始化,执行起postProcessBeanDefinitionRegistry方法注册新的BeanDefinition
      • 从容器中获取剩余的BeanDefinitionRegistryPostProcessor,初始化,执行起postProcessBeanDefinitionRegistry方法注册新的BeanDefinition
    • 执行以上BeanDefinitionRegistryPostProcessor处理器的postProcessBeanFactory
    • 依次获取并执行实现了PriorityOrderedOrdered及其他的postProcessBeanFactory方法
        public static void invokeBeanFactoryPostProcessors(
                ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
    
            // WARNING: Although it may appear that the body of this method can be easily
            // refactored to avoid the use of multiple loops and multiple lists, the use
            // of multiple lists and multiple passes over the names of processors is
            // intentional. We must ensure that we honor the contracts for PriorityOrdered
            // and Ordered processors. Specifically, we must NOT cause processors to be
            // instantiated (via getBean() invocations) or registered in the ApplicationContext
            // in the wrong order.
            //
            // Before submitting a pull request (PR) to change this method, please review the
            // list of all declined PRs involving changes to PostProcessorRegistrationDelegate
            // to ensure that your proposal does not result in a breaking change:
            // https://github.com/spring-projects/spring-framework/issues?q=PostProcessorRegistrationDelegate+is%3Aclosed+label%3A%22status%3A+declined%22
    
            // Invoke BeanDefinitionRegistryPostProcessors first, if any.
            // 如果存在BeanDefinitionRegistryPostProcessor,执行其postProcessBeanDefinitionRegistry方法,修改BeanDefinition列表
            Set<String> processedBeans = new HashSet<>();
    
            if (beanFactory instanceof BeanDefinitionRegistry) {
                BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
                List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
                List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
    
                for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
                    if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                        BeanDefinitionRegistryPostProcessor registryProcessor =
                                (BeanDefinitionRegistryPostProcessor) postProcessor;
                        registryProcessor.postProcessBeanDefinitionRegistry(registry);
                        registryProcessors.add(registryProcessor);
                    }
                    else {
                        regularPostProcessors.add(postProcessor);
                    }
                }
    
                // Do not initialize FactoryBeans here: We need to leave all regular beans
                // uninitialized to let the bean factory post-processors apply to them!
                // Separate between BeanDefinitionRegistryPostProcessors that implement
                // PriorityOrdered, Ordered, and the rest.
                List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
    
                // First, invoke the BeanDefinitionRegistryPostProcessors that implement PriorityOrdered.
            // 获取实现了PriorityOrdered的BeanDefinitionRegistryPostProcessor,并初始化(ConfigurationClassPostProcessor在此时被初始化)
                String[] postProcessorNames =
    beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                for (String ppName : postProcessorNames) {
                    if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        processedBeans.add(ppName);
                    }
                }
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                registryProcessors.addAll(currentRegistryProcessors);
                            // 执行postProcessBeanDefinitionRegistry方法,修改容器BeanDefinition列表,BeanDefinition解析在这里处理
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
                currentRegistryProcessors.clear();
    
                // Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered.
                            // 获取实现了Ordered的BeanDefinitionRegistryPostProcessor处理器,初始化并执行其invokeBeanDefinitionRegistryPostProcessors方法
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                for (String ppName : postProcessorNames) {
                    if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        processedBeans.add(ppName);
                    }
                }
                sortPostProcessors(currentRegistryProcessors, beanFactory);
                registryProcessors.addAll(currentRegistryProcessors);
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
                currentRegistryProcessors.clear();
    
                // Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear.
                            // 循环获取BeanDefinitionRegistryPostProcessor,初始化,执行invokeBeanDefinitionRegistryPostProcessors方法,直到无新的BeanDefinitionRegistryPostProcessor时结束
                boolean reiterate = true;
                while (reiterate) {
                    reiterate = false;
                    postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                    for (String ppName : postProcessorNames) {
                        if (!processedBeans.contains(ppName)) {
                            currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                            processedBeans.add(ppName);
                            reiterate = true;
                        }
                    }
                    sortPostProcessors(currentRegistryProcessors, beanFactory);
                    registryProcessors.addAll(currentRegistryProcessors);
                    invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
                    currentRegistryProcessors.clear();
                }
    
                // Now, invoke the postProcessBeanFactory callback of all processors handled so far.
                            // 执行后置处理器的postProcessBeanFactory方法,该方法需BeanDefinition注册完调用
                invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
                invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
            }
    
            else {
                // Invoke factory processors registered with the context instance.
                invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
            }
    
            // Do not initialize FactoryBeans here: We need to leave all regular beans
            // uninitialized to let the bean factory post-processors apply to them!
                    // 获取BeanFactoryPostProcessor,初始化并执行后置处理器的postProcessBeanFactory方法,该方法需BeanDefinition注册完调用
            String[] postProcessorNames =
                    beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
    
            // Separate between BeanFactoryPostProcessors that implement PriorityOrdered,
            // Ordered, and the rest.
            List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
            List<String> orderedPostProcessorNames = new ArrayList<>();
            List<String> nonOrderedPostProcessorNames = new ArrayList<>();
            for (String ppName : postProcessorNames) {
                if (processedBeans.contains(ppName)) {
                    // skip - already processed in first phase above
                }
                else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                }
                else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    orderedPostProcessorNames.add(ppName);
                }
                else {
                    nonOrderedPostProcessorNames.add(ppName);
                }
            }
    
            // First, invoke the BeanFactoryPostProcessors that implement PriorityOrdered.
            sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
            invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
    
            // Next, invoke the BeanFactoryPostProcessors that implement Ordered.
            List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
            for (String postProcessorName : orderedPostProcessorNames) {
                orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
            }
            sortPostProcessors(orderedPostProcessors, beanFactory);
            invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
    
            // Finally, invoke all other BeanFactoryPostProcessors.
            List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
            for (String postProcessorName : nonOrderedPostProcessorNames) {
                nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
            }
            invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
    
            // Clear cached merged bean definitions since the post-processors might have
            // modified the original metadata, e.g. replacing placeholders in values...
            beanFactory.clearMetadataCache();
        }
    

    5.4 ConfigurationClassPostProcessor解析过程

    ConfigurationClassPostProcessor解析过程比较简单:

    • 从容器的BeanDefinition列表中获取配置类
    • 设置BeanNameGenerator
    • 创建ConfigurationClassParser,并委托给parser解析
    • 递归从解析结果中继续获取配置类,并委托给ConfigurationClassParser解析,直到没有配置类
        public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) {
            List<BeanDefinitionHolder> configCandidates = new ArrayList<>();
            String[] candidateNames = registry.getBeanDefinitionNames();
    
                // 查找配置类,注解为@ Configuration、@Component、@ComponentScan、@Import、@ImportResource
            for (String beanName : candidateNames) {
                BeanDefinition beanDef = registry.getBeanDefinition(beanName);
                if (beanDef.getAttribute(ConfigurationClassUtils.CONFIGURATION_CLASS_ATTRIBUTE) != null) {
                    if (logger.isDebugEnabled()) {
                        logger.debug("Bean definition has already been processed as a configuration class: " + beanDef);
                    }
                }
                else if (ConfigurationClassUtils.checkConfigurationClassCandidate(beanDef, this.metadataReaderFactory)) {
                    configCandidates.add(new BeanDefinitionHolder(beanDef, beanName));
                }
            }
    
            // Return immediately if no @Configuration classes were found
            if (configCandidates.isEmpty()) {
                return;
            }
    
            // Sort by previously determined @Order value, if applicable
            // 排序操作
            configCandidates.sort((bd1, bd2) -> {
                int i1 = ConfigurationClassUtils.getOrder(bd1.getBeanDefinition());
                int i2 = ConfigurationClassUtils.getOrder(bd2.getBeanDefinition());
                return Integer.compare(i1, i2);
            });
    
            // Detect any custom bean name generation strategy supplied through the enclosing application context
    // 检测是否存在自定义bean name生成策略,如果存在,创建并设置
            SingletonBeanRegistry sbr = null;
            if (registry instanceof SingletonBeanRegistry) {
                sbr = (SingletonBeanRegistry) registry;
                if (!this.localBeanNameGeneratorSet) {
                    BeanNameGenerator generator = (BeanNameGenerator) sbr.getSingleton(
                            AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR);
                    if (generator != null) {
                        this.componentScanBeanNameGenerator = generator;
                        this.importBeanNameGenerator = generator;
                    }
                }
            }
    
            if (this.environment == null) {
                this.environment = new StandardEnvironment();
            }
    
            // Parse each @Configuration class
                    // 创建ConfigurationClassParser,具体解析委托给ConfigurationClassParser
            ConfigurationClassParser parser = new ConfigurationClassParser(
                    this.metadataReaderFactory, this.problemReporter, this.environment,
                    this.resourceLoader, this.componentScanBeanNameGenerator, registry);
    
            Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
            Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
                    // 递归调用,解析配置类,并从解析结果中筛选未解析的配置类,继续解析,直到无配置类
            do {
                StartupStep processConfig = this.applicationStartup.start("spring.context.config-classes.parse");
                parser.parse(candidates);
                parser.validate();
    
                Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());
                configClasses.removeAll(alreadyParsed);
    
                // Read the model and create bean definitions based on its content
                if (this.reader == null) {
                    this.reader = new ConfigurationClassBeanDefinitionReader(
                            registry, this.sourceExtractor, this.resourceLoader, this.environment,
                            this.importBeanNameGenerator, parser.getImportRegistry());
                }
                this.reader.loadBeanDefinitions(configClasses);
                alreadyParsed.addAll(configClasses);
                processConfig.tag("classCount", () -> String.valueOf(configClasses.size())).end();
    
                candidates.clear();
                if (registry.getBeanDefinitionCount() > candidateNames.length) {
                    String[] newCandidateNames = registry.getBeanDefinitionNames();
                    Set<String> oldCandidateNames = new HashSet<>(Arrays.asList(candidateNames));
                    Set<String> alreadyParsedClasses = new HashSet<>();
                    for (ConfigurationClass configurationClass : alreadyParsed) {
                        alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());
                    }
                    for (String candidateName : newCandidateNames) {
                        if (!oldCandidateNames.contains(candidateName)) {
                            BeanDefinition bd = registry.getBeanDefinition(candidateName);
                            if (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this.metadataReaderFactory) &&
                                    !alreadyParsedClasses.contains(bd.getBeanClassName())) {
                                candidates.add(new BeanDefinitionHolder(bd, candidateName));
                            }
                        }
                    }
                    candidateNames = newCandidateNames;
                }
            }
            while (!candidates.isEmpty());
    
            // Register the ImportRegistry as a bean in order to support ImportAware @Configuration classes
            if (sbr != null && !sbr.containsSingleton(IMPORT_REGISTRY_BEAN_NAME)) {
                sbr.registerSingleton(IMPORT_REGISTRY_BEAN_NAME, parser.getImportRegistry());
            }
    
            if (this.metadataReaderFactory instanceof CachingMetadataReaderFactory) {
                // Clear cache in externally provided MetadataReaderFactory; this is a no-op
                // for a shared cache since it'll be cleared by the ApplicationContext.
                ((CachingMetadataReaderFactory) this.metadataReaderFactory).clearCache();
            }
        }
    

    5.5 ConfigurationClassParser解析过程

    parse方法遍历配置类,调用重载的parse(((AnnotatedBeanDefinition) bd).getMetadata()完成解析。

        public void parse(Set<BeanDefinitionHolder> configCandidates) {
            for (BeanDefinitionHolder holder : configCandidates) {
                BeanDefinition bd = holder.getBeanDefinition();
                try {
                    if (bd instanceof AnnotatedBeanDefinition) {
                        parse(((AnnotatedBeanDefinition) bd).getMetadata(), holder.getBeanName());
                    }
                    else if (bd instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) bd).hasBeanClass()) {
                        parse(((AbstractBeanDefinition) bd).getBeanClass(), holder.getBeanName());
                    }
                    else {
                        parse(bd.getBeanClassName(), holder.getBeanName());
                    }
                }
                catch (BeanDefinitionStoreException ex) {
                    throw ex;
                }
                catch (Throwable ex) {
                    throw new BeanDefinitionStoreException(
                            "Failed to parse configuration class [" + bd.getBeanClassName() + "]", ex);
                }
            }
    
            this.deferredImportSelectorHandler.process();
        }
    

    parse调用processConfigurationClass解析。

        protected final void parse(AnnotationMetadata metadata, String beanName) throws IOException {
            processConfigurationClass(new ConfigurationClass(metadata, beanName), DEFAULT_EXCLUSION_FILTER);
        }
    

    processConfigurationClass实现如下:

    protected void processConfigurationClass(ConfigurationClass configClass, Predicate<String> filter) throws IOException {
            // 判断 @Conditional 注解是否满足条件
            if (this.conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) {
                return;
            }
    
            ConfigurationClass existingClass = this.configurationClasses.get(configClass);
            if (existingClass != null) {
                if (configClass.isImported()) {
                    // 如果已经解析过,且是@Import的类,不重复解析
                    if (existingClass.isImported()) {
                        existingClass.mergeImportedBy(configClass);
                    }
                    // Otherwise ignore new imported config class; existing non-imported class overrides it.
                    return;
                }
                else {
                    // Explicit bean definition found, probably replacing an import.
                    // Let's remove the old one and go with the new one.
                    // 如果已经解析过,但不是@Import的,重复解析覆盖
                    this.configurationClasses.remove(configClass);
                    this.knownSuperclasses.values().removeIf(configClass::equals);
                }
            }
    
            // Recursively process the configuration class and its superclass hierarchy.
            // 统一封装成SourceClass处理
            SourceClass sourceClass = asSourceClass(configClass, filter);
            do {
                            // 实际的解析动作
                sourceClass = doProcessConfigurationClass(configClass, sourceClass, filter);
            }
            while (sourceClass != null);
    
            this.configurationClasses.put(configClass, configClass);
        }
    

    doProcessConfigurationClass解析过程:

        protected final SourceClass doProcessConfigurationClass(
                ConfigurationClass configClass, SourceClass sourceClass, Predicate<String> filter)
                throws IOException {
    
            if (configClass.getMetadata().isAnnotated(Component.class.getName())) {
                // Recursively process any member (nested) classes first
                // 递归处理内部类
                processMemberClasses(configClass, sourceClass, filter);
            }
    
            // Process any @PropertySource annotations
            // 处理@PropertySource注解,比较简单,可见官网@PropertySource的用法
            for (AnnotationAttributes propertySource : AnnotationConfigUtils.attributesForRepeatable(
                    sourceClass.getMetadata(), PropertySources.class,
                    org.springframework.context.annotation.PropertySource.class)) {
                if (this.environment instanceof ConfigurableEnvironment) {
                    processPropertySource(propertySource);
                }
                else {
                    logger.info("Ignoring @PropertySource annotation on [" + sourceClass.getMetadata().getClassName() +
                            "]. Reason: Environment must implement ConfigurableEnvironment");
                }
            }
    
            // Process any @ComponentScan annotations
            Set<AnnotationAttributes> componentScans = AnnotationConfigUtils.attributesForRepeatable(
                    sourceClass.getMetadata(), ComponentScans.class, ComponentScan.class);
            if (!componentScans.isEmpty() &&
                    !this.conditionEvaluator.shouldSkip(sourceClass.getMetadata(), ConfigurationPhase.REGISTER_BEAN)) {
                for (AnnotationAttributes componentScan : componentScans) {
                    // The config class is annotated with @ComponentScan -> perform the scan immediately
                    // 真正的解析动作委托给ComponentScanAnnotationParser#parse处理
                    Set<BeanDefinitionHolder> scannedBeanDefinitions =
                            this.componentScanParser.parse(componentScan, sourceClass.getMetadata().getClassName());
                    // Check the set of scanned definitions for any further config classes and parse recursively if needed
                    for (BeanDefinitionHolder holder : scannedBeanDefinitions) {
                        BeanDefinition bdCand = holder.getBeanDefinition().getOriginatingBeanDefinition();
                        if (bdCand == null) {
                            bdCand = holder.getBeanDefinition();
                        }
                        if (ConfigurationClassUtils.checkConfigurationClassCandidate(bdCand, this.metadataReaderFactory)) {
                            // 递归遍历已解析后的BeanDefinition
                            parse(bdCand.getBeanClassName(), holder.getBeanName());
                        }
                    }
                }
            }
    
            // Process any @Import annotations
            // 处理@Import注解
            processImports(configClass, sourceClass, getImports(sourceClass), filter, true);
    
            // Process any @ImportResource annotations
            // 处理@ImportResource注解
            AnnotationAttributes importResource =
                    AnnotationConfigUtils.attributesFor(sourceClass.getMetadata(), ImportResource.class);
            if (importResource != null) {
                String[] resources = importResource.getStringArray("locations");
                Class<? extends BeanDefinitionReader> readerClass = importResource.getClass("reader");
                for (String resource : resources) {
                    String resolvedResource = this.environment.resolveRequiredPlaceholders(resource);
                    configClass.addImportedResource(resolvedResource, readerClass);
                }
            }
    
            // Process individual @Bean methods
            // 处理方法@Bean注解
            Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
            for (MethodMetadata methodMetadata : beanMethods) {
                configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass));
            }
    
            // Process default methods on interfaces
            // 处理接口中的默认方法实现中的 @Bean注解
            processInterfaces(configClass, sourceClass);
    
            // Process superclass, if any
            // 处理父类
            if (sourceClass.getMetadata().hasSuperClass()) {
                String superclass = sourceClass.getMetadata().getSuperClassName();
                if (superclass != null && !superclass.startsWith("java") &&
                        !this.knownSuperclasses.containsKey(superclass)) {
                    this.knownSuperclasses.put(superclass, configClass);
                    // Superclass found, return its annotation metadata and recurse
                    return sourceClass.getSuperClass();
                }
            }
    
            // No superclass -> processing is complete
            return null;
        }
    

    5.6 ComponentScanAnnotationParser解析过程

    ComponentScanAnnotationParser 解析 @ComponentScan 属性,委托给 ClassPathBeanDefinitionScanner解析。

        public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, String declaringClass) {
            ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(this.registry,
                    componentScan.getBoolean("useDefaultFilters"), this.environment, this.resourceLoader);
    
            Class<? extends BeanNameGenerator> generatorClass = componentScan.getClass("nameGenerator");
            boolean useInheritedGenerator = (BeanNameGenerator.class == generatorClass);
            scanner.setBeanNameGenerator(useInheritedGenerator ? this.beanNameGenerator :
                    BeanUtils.instantiateClass(generatorClass));
    
            ScopedProxyMode scopedProxyMode = componentScan.getEnum("scopedProxy");
            if (scopedProxyMode != ScopedProxyMode.DEFAULT) {
                scanner.setScopedProxyMode(scopedProxyMode);
            }
            else {
                Class<? extends ScopeMetadataResolver> resolverClass = componentScan.getClass("scopeResolver");
                scanner.setScopeMetadataResolver(BeanUtils.instantiateClass(resolverClass));
            }
    
            scanner.setResourcePattern(componentScan.getString("resourcePattern"));
    
            for (AnnotationAttributes includeFilterAttributes : componentScan.getAnnotationArray("includeFilters")) {
                List<TypeFilter> typeFilters = TypeFilterUtils.createTypeFiltersFor(includeFilterAttributes, this.environment,
                        this.resourceLoader, this.registry);
                for (TypeFilter typeFilter : typeFilters) {
                    scanner.addIncludeFilter(typeFilter);
                }
            }
            for (AnnotationAttributes excludeFilterAttributes : componentScan.getAnnotationArray("excludeFilters")) {
                List<TypeFilter> typeFilters = TypeFilterUtils.createTypeFiltersFor(excludeFilterAttributes, this.environment,
                    this.resourceLoader, this.registry);
                for (TypeFilter typeFilter : typeFilters) {
                    scanner.addExcludeFilter(typeFilter);
                }
            }
    
            boolean lazyInit = componentScan.getBoolean("lazyInit");
            if (lazyInit) {
                scanner.getBeanDefinitionDefaults().setLazyInit(true);
            }
    
            Set<String> basePackages = new LinkedHashSet<>();
            String[] basePackagesArray = componentScan.getStringArray("basePackages");
            for (String pkg : basePackagesArray) {
                String[] tokenized = StringUtils.tokenizeToStringArray(this.environment.resolvePlaceholders(pkg),
                        ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
                Collections.addAll(basePackages, tokenized);
            }
            for (Class<?> clazz : componentScan.getClassArray("basePackageClasses")) {
                basePackages.add(ClassUtils.getPackageName(clazz));
            }
            if (basePackages.isEmpty()) {
                basePackages.add(ClassUtils.getPackageName(declaringClass));
            }
    
            scanner.addExcludeFilter(new AbstractTypeHierarchyTraversingFilter(false, false) {
                @Override
                protected boolean matchClassName(String className) {
                    return declaringClass.equals(className);
                }
            });
            return scanner.doScan(StringUtils.toStringArray(basePackages));
        }
    

    5.7 ClassPathBeanDefinitionScanner解析过程

    解析BeanDefinition,并注册到spring容器。

        protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
            Assert.notEmpty(basePackages, "At least one base package must be specified");
            Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
            for (String basePackage : basePackages) {
                // 扫描所有`@Component`(包括`@Service`/`@Repository`/`@Controller`)注解类
                Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
                for (BeanDefinition candidate : candidates) {
                                     // 处理 @Scope 注解
                    ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
                    candidate.setScope(scopeMetadata.getScopeName());
                    String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
                    // 设置默认参数
                    if (candidate instanceof AbstractBeanDefinition) {
                        postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
                    }
                    if (candidate instanceof AnnotatedBeanDefinition) {
    // 解析通用注解,包括@Lazy,@Primary,@DependsOn,@Role,@Description注解
    AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
                    }
                                    // 判断是否已注册,如果未注册,注册到spring容器
                    if (checkCandidate(beanName, candidate)) {
                        BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
                        definitionHolder =
                                AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
                        beanDefinitions.add(definitionHolder);
                        registerBeanDefinition(definitionHolder, this.registry);
                    }
                }
            }
            return beanDefinitions;
        }
    

    相关文章

      网友评论

          本文标题:spring 系列:spring IOC之BeanDefinit

          本文链接:https://www.haomeiwen.com/subject/ogtbzrtx.html