SpringApplication.createApplicationContext()
/**判断是否是WEB环境,是的话实例化AnnotationConfigEmbeddedWebApplicationContext作为应用程序上下文
反之取AnnotationConfigApplicationContext作为应用程序上下文
*/
——》contextClass = Class.forName(this.webEnvironment ? DEFAULT_WEB_CONTEXT_CLASS : DEFAULT_CONTEXT_CLASS);
/**实例化上下文,也就是通过BeanUtils生成上下文对象。调用空参构造函数进行实例化
*/
——》return (ConfigurableApplicationContext) BeanUtils.instantiate(contextClass);
——》1、先判断是否是接口,是的话报错
2、反之使用Class.newInstance()实例化bean对象
——》再调用Constructor.newInstance(Object... initargs)
AnnotationConfigApplicationContext空参构造函数实例化过程
AnnotationConfigApplicationContext空参构造函数实例化过程
——》this.reader = new AnnotatedBeanDefinitionReader(this);
——》this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
——》this.context = new ConditionContextImpl(registry, environment, resourceLoader);
/**
推断BeanFactory得到DefaultListableBeanFactory
private ConfigurableListableBeanFactory deduceBeanFactory(BeanDefinitionRegistry source) {
if (source instanceof ConfigurableListableBeanFactory) {
return (ConfigurableListableBeanFactory) source;
}
if (source instanceof ConfigurableApplicationContext) {
return (((ConfigurableApplicationContext) source).getBeanFactory());
}
return null;
}
由于都实现了ConfigurableApplicationContext接口所以走(((ConfigurableApplicationContext) source).getBeanFactory());
实际就是调用GenericApplicationContext.getBeanFactory(),返回DefaultListableBeanFactory
*/
——》this.beanFactory = deduceBeanFactory(registry);
——》this.environment = (environment != null ? environment : deduceEnvironment(registry));
——》this.resourceLoader = (resourceLoader != null ? resourceLoader : deduceResourceLoader(registry));
/**
注册@Autowired注解解析器ContextAnnotationAutowireCandidateResolver到容器,
注册相关的后置处理器ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor(JPA才会注册)
EventListenerMethodProcessor,还有注册一个DefaultEventListenerFactory
通过registry.registerBeanDefinition(beanName, definition);实现bean的注册,其中registry就是应用程序上下文AnnotationConfigApplicationContext
而registry.registerBeanDefinition会调用DefaultListableBeanFactory的this.beanFactory.registerBeanDefinition(beanName, beanDefinition);
*/
——》AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
//设置依赖排序器是new AnnotationAwareOrderComparator();
——》beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
/**设置Autowire注解的候选自动装配解析器new ContextAnnotationAutowireCandidateResolver()
也就是说我们的@Autowired注解就是通过这个bean进行解析的
*/
——》beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
/**
通过RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
添加ConfigurationClassPostProcessor后置处理器到容器中
*/
——》beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
/**
添加AutowiredAnnotationBeanPostProcessor后置处理器
*/
——》beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
/**
添加RequiredAnnotationBeanPostProcessor后置处理器
*/
——》beanDefs.add(registerPostProcessor(registry, def, REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
/**
添加CommonAnnotationBeanPostProcessor后置处理器
*/
——》beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
/**
如果支持JPA,添加PersistenceAnnotationBeanPostProcessor后置处理器
*/
——》beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
/**
添加EventListenerMethodProcessor后置处理器
*/
——》beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
/**
添加DefaultEventListenerFactory
*/
——》beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
——》
——》this.scanner = new ClassPathBeanDefinitionScanner(this);
——》ClassPathBeanDefinitionScanner.ClassPathBeanDefinitionScanner()
——》registerDefaultFilters();
/**
向过滤器中添加this.includeFilters.add(new AnnotationTypeFilter(Component.class));
includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));
也就是让基于注解的解析器支持JSR-250的javax.inject.Named
includeFilters.add(new AnnotationTypeFilter(((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));
也就是让基于注解的解析器支持JSR-330的javax.annotation.ManagedBean
*/
——》ClassPathScanningCandidateComponentProvider.registerDefaultFilters()
总结
至此,创建应用上下文走玩,主要做了三步,1、根据环境配置去实例化AnnotationConfigApplication或者AnnotationConfigEmbeddedWebApplicationContext
2、注册@Autowired注解解析器ContextAnnotationAutowireCandidateResolver到容器,
注册相关的后置处理器ConfigurationClassPostProcessor、AutowiredAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor(JPA才会注册)
EventListenerMethodProcessor,还有注册一个DefaultEventListenerFactory
3、向过滤器中添加this.includeFilters.add(new AnnotationTypeFilter(Component.class)),添加基于注解的解析器支持JSR-250的javax.inject.Named,添加基于注解的解析器支持JSR-330的javax.annotation.ManagedBean
创建应用程序上下文所用到的设计模式
1、