Back to Javatutorial

Spring启动流程(二):ApplicationContext的创建

docs/Spring全家桶/Spring源码分析/Spring启动流程/Spring启动流程(二):ApplicationContext的创建.md

1.0.06.2 KB
Original Source

ǰһƪУǷ spring ̣ƪʼ ǽеһЩؼз

ǻڵ demo01ֱӽ ApplicationContext context = new AnnotationConfigApplicationContext("org.springframework.learn.demo01"); ִУ

AnnotationConfigApplicationContext

public AnnotationConfigApplicationContext(String... basePackages) {
    this();
    scan(basePackages);
    refresh();
}

ֻУÿд spring ̸˵ǽЩչϸݡ

1. beanFacotry Ĵ

ֱӽ this() £

AnnotationConfigApplicationContext

public AnnotationConfigApplicationContext() {
    // AnnotatedBeanDefinitionReader  @Configuration
    this.reader = new AnnotatedBeanDefinitionReader(this);
    this.scanner = new ClassPathBeanDefinitionScanner(this);
}

ϿֻУ󡣵Ϥ java ﷨Ķ֪ڵù췽ʱȵøĹ췽ִ๹췽Ĵ룬ЩǻҪĸ๹췽ʲô

GenericApplicationContext

public GenericApplicationContext() {
    this.beanFactory = new DefaultListableBeanFactory();
}

ԿĹ췽һ£ beanFactoryԴˣǿ֪**AnnotationConfigApplicationContext ʹõ BeanFacotry Ϊ DefaultListableBeanFactory**

ٻص AnnotationConfigApplicationContext Ĺ췽

AnnotationConfigApplicationContext

public AnnotationConfigApplicationContext() {
    // AnnotatedBeanDefinitionReader  @Configuration
    this.reader = new AnnotatedBeanDefinitionReader(this);
    this.scanner = new ClassPathBeanDefinitionScanner(this);
}

ȻֻУȴС new AnnotatedBeanDefinitionReader(this); £еķòҪṩ

AnnotationConfigApplicationContext#AnnotationConfigApplicationContext()
 |-AnnotatedBeanDefinitionReader#AnnotatedBeanDefinitionReader(BeanDefinitionRegistry)
  |-AnnotatedBeanDefinitionReader#AnnotatedBeanDefinitionReader(BeanDefinitionRegistry, Environment)
   |-AnnotationConfigUtils#registerAnnotationConfigProcessors(BeanDefinitionRegistry)
    |-AnnotationConfigUtils#registerAnnotationConfigProcessors(BeanDefinitionRegistry, Object)

Կǵ AnnotationConfigUtils#registerAnnotationConfigProcessors(BeanDefinitionRegistry, Object)Dz鿴¸÷Ϊֱ۲鿴ʡ˲ҪĴ룬ǽעҪ̼ɣ

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
        BeanDefinitionRegistry registry, @Nullable Object source) {
    // beanFactory
    DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);

    // -------- beanFactoryӴ
    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);

    // ------------  beanFactorybeanDefinition
    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));
    }

    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.
    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.
    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(...);
        }
        def.setSource(source);
        beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
    }

    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));
    }

    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;
}

Ȼе㳤ȴ൱ֱף beanFactory annotation صĴʵϣ spring ̸ᵽ beanDefinitionMap 4 Ĭϵ beanDefinition ӵģ

ٹע this.scanner = new ClassPathBeanDefinitionScanner(this)dzʼ scanner Ϊ ClassPathBeanDefinitionScannerϿԿ classPath صģbeanDefinition ɨͨ׵˵**ɨ classPath · java class ļװ beanDefinition **

2. ܽ

AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(String...) this() ִоͷˣһ дҪ⼸£

  1. Ϊ DefaultListableBeanFactory beanFactory
  2. Ϊ AnnotatedBeanDefinitionReader reader䴴ĹУ beanFactory annotation صĴ
  3. Ϊ ClassPathBeanDefinitionScanner scanner

ͼʾ£

ľȵˣǼĴ롣