spring启动扫描业务组件时机

AbstractApplicationContext    refresh()方法 515行  获取新的IOC 容器

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

refreshBeanFactory() 调用子类AbstractRefreshableApplicationContext的方法

AbstractRefreshableApplicationContext类的第129行加载beanDefinition

因为是基于注解,这里看AnnotationConfigWebApplicationContext类的loadBeanDefinitions方法

第219行scanner.scan(StringUtils.toStringArray(this.basePackages));

继续看ClassPathBeanDefinitionScanner的247行scan方法

scan方法中doScan(basePackages);根据basePackages扫描业务类

ClassPathBeanDefinitionScanner的268行doScan()方法

Set<BeanDefinition> candidates = findCandidateComponents(basePackage);

将扫描到的组件都包装成BeanDefinition类型

在doScan()方法288行registerBeanDefinition(definitionHolder, this.registry);将扫描到的Bean定义添加到IOC容器

总结:Spring容器在启动的时候,先会保存所有注册进来的Bean的定义信息;

        1、xml注册bean;<bean>
        2、注解注册Bean;@Service、@Component、@Bean、xxx

      2)、Spring容器会合适的时机创建这些Bean
        1、用到这个bean的时候;利用getBean创建bean;创建好以后保存在容器中;
        2、统一创建剩下所有的bean的时候;finishBeanFactoryInitialization();
      3)、后置处理器;BeanPostProcessor
        1、每一个bean创建完成,都会使用各种后置处理器进行处理;来增强bean的功能;
            AutowiredAnnotationBeanPostProcessor:处理自动注入
            AnnotationAwareAspectJAutoProxyCreator:来做AOP功能;
            xxx....
            增强的功能注解:
            AsyncAnnotationBeanPostProcessor
            ....
    4)、事件驱动模型;
        ApplicationListener;事件监听;
        ApplicationEventMulticaster;事件派发:

猜你喜欢

转载自blog.csdn.net/u010016770/article/details/86303396