/**
* AnnotatedBeanDefinitionReader的构造方法
*/publicAnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry,Environment environment){Assert.notNull(registry,"BeanDefinitionRegistry must not be null");Assert.notNull(environment,"Environment must not be null");this.registry = registry;// 用来解析@Conditional注解的this.conditionEvaluator =newConditionEvaluator(registry, environment,null);// 注册AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);}/**
* 注册的具体内容
*/publicstaticSet<BeanDefinitionHolder>registerAnnotationConfigProcessors(BeanDefinitionRegistry registry,@NullableObject source){DefaultListableBeanFactory beanFactory =unwrapDefaultListableBeanFactory(registry);if(beanFactory !=null){// 设置beanFactory的OrderComparator为AnnotationAwareOrderComparator// 它是一个Comparator,是一个比较器,可以用来进行排序,比如new ArrayList<>().sort(Comparator);if(!(beanFactory.getDependencyComparator()instanceofAnnotationAwareOrderComparator)){
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);}// 用来判断某个Bean能不能用来进行依赖注入if(!(beanFactory.getAutowireCandidateResolver()instanceofContextAnnotationAutowireCandidateResolver)){
beanFactory.setAutowireCandidateResolver(newContextAnnotationAutowireCandidateResolver());}}Set<BeanDefinitionHolder> beanDefs =newLinkedHashSet<>(8);// 注册ConfigurationClassPostProcessor类型的BeanDefinitionif(!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)){// 这里是注册BeanFactoryPostProcessor,用来解析配置类RootBeanDefinition def =newRootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));}// 注册AutowiredAnnotationBeanPostProcessor类型的BeanDefinition,主要用来除了@Autowired注解,这里只放入了BeanDefinitionMap中if(!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)){RootBeanDefinition def =newRootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));}// 注册CommonAnnotationBeanPostProcessor类型的BeanDefinition,主要用来除了@Resource注解,这里只放入了BeanDefinitionMap中// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.if(jsr250Present &&!registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)){RootBeanDefinition def =newRootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));}// 注册PersistenceAnnotationBeanPostProcessor类型的BeanDefinition// Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.if(jpaPresent &&!registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)){RootBeanDefinition def =newRootBeanDefinition();try{
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,AnnotationConfigUtils.class.getClassLoader()));}catch(ClassNotFoundException ex){thrownewIllegalStateException("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类型的BeanDefinition,用来处理@EventListener注解的if(!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)){RootBeanDefinition def =newRootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));}// 注册DefaultEventListenerFactory类型的BeanDefinition,用来处理@EventListener注解的if(!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)){RootBeanDefinition def =newRootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));}return beanDefs;}
构造ClassPathBeanDefinitionScanner源码分析
/**
* ClassPathBeanDefinitionScanner的构造方法
*/publicClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry,boolean useDefaultFilters,Environment environment,@NullableResourceLoader resourceLoader){Assert.notNull(registry,"BeanDefinitionRegistry must not be null");this.registry = registry;// 设置一些默认的扫描if(useDefaultFilters){registerDefaultFilters();}// 设置环境变量setEnvironment(environment);// 设置源读取器setResourceLoader(resourceLoader);}/**
* ClassPathBeanDefinitionScanner的默认扫描的类
*/protectedvoidregisterDefaultFilters(){// 注册@Component对应的AnnotationTypeFilter。默认扫描加了@Component注解的类,把他当做Beanthis.includeFilters.add(newAnnotationTypeFilter(Component.class));ClassLoader cl =ClassPathScanningCandidateComponentProvider.class.getClassLoader();try{this.includeFilters.add(newAnnotationTypeFilter(((Class<?extendsAnnotation>)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(newAnnotationTypeFilter(((Class<?extendsAnnotation>)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.}}
publicvoidregister(Class<?>... componentClasses){// 校验Assert.notEmpty(componentClasses,"At least one component class must be specified");// 日期记录StartupStep registerComponentClass =this.getApplicationStartup().start("spring.context.component-classes.register").tag("classes",()->Arrays.toString(componentClasses));// 注册到BeanDefinitionMap中this.reader.register(componentClasses);
registerComponentClass.end();}
构造的第三行refresh();源码分析
publicvoidrefresh()throwsBeansException,IllegalStateException{synchronized(this.startupShutdownMonitor){StartupStep contextRefresh =this.applicationStartup.start("spring.context.refresh");// Prepare this context for refreshing.// 准备刷新的操作// 设置一些标记、检查必要的keyprepareRefresh();// Tell the subclass to refresh the internal bean factory.// 这里会判断能否刷新,并且返回一个BeanFactory, 刷新不代表完全情况,主要是先执行Bean的销毁,然后重新生成一个BeanFactory,再在接下来的步骤中重新去扫描等等。// 简单说,boot支持重复刷新,MVC支持ConfigurableListableBeanFactory beanFactory =obtainFreshBeanFactory();// Prepare the bean factory for use in this context.// 准备BeanFactory// 1. 设置BeanFactory的类加载器、SpringEL表达式解析器、类型转化注册器// 2. 添加三个BeanPostProcessor,注意是具体的BeanPostProcessor实例对象// 3. 记录ignoreDependencyInterface// 4. 记录ResolvableDependency// 5. 添加三个单例BeanprepareBeanFactory(beanFactory);try{// Allows post-processing of the bean factory in context subclasses.// 模板方法模式,子类来设置一下BeanFactory。// MVC进行了实现,boot基本上无实现postProcessBeanFactory(beanFactory);StartupStep beanPostProcess =this.applicationStartup.start("spring.context.beans.post-process");// Invoke factory processors registered as beans in the context.// BeanFactory准备好了之后,执行BeanFactoryPostProcessor,开始对BeanFactory进行处理// 默认情况下:// 此时beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的BeanDefinition// 而这6个中只有一个BeanFactoryPostProcessor:ConfigurationClassPostProcessor// 这里会执行ConfigurationClassPostProcessor进行@Component的扫描,扫描得到BeanDefinition,并注册到beanFactory中// 注意:扫描的过程中可能又会扫描出其他的BeanFactoryPostProcessor,那么这些BeanFactoryPostProcessor也得在这一步执行invokeBeanFactoryPostProcessors(beanFactory);// scanner.scan()// Register bean processors that intercept bean creation.// 将扫描到的BeanPostProcessors实例化并排序,并添加到BeanFactory的beanPostProcessors属性中去registerBeanPostProcessors(beanFactory);
beanPostProcess.end();// Initialize message source for this context.// 国际化处理:设置ApplicationContext的MessageSource,要么是用户设置的,要么是DelegatingMessageSourceinitMessageSource();// Initialize event multicaster for this context.// 事件发布器处理:设置ApplicationContext的applicationEventMulticaster,么是用户设置的,要么是SimpleApplicationEventMulticasterinitApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.// 给子类的模板方法onRefresh();// Check for listener beans and register them.// 事件监听器处理:把定义的ApplicationListener的Bean对象,设置到ApplicationContext中去,并执行在此之前所发布的事件registerListeners();// Instantiate all remaining (non-lazy-init) singletons.// 加载非懒加载的单例BeanfinishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.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();}}}
准备刷新prepareRefresh源码分析
protectedvoidprepareRefresh(){// Switch to active.// 设置一些标记,开始工作this.startupDate =System.currentTimeMillis();this.closed.set(false);this.active.set(true);// 打印日志if(logger.isDebugEnabled()){if(logger.isTraceEnabled()){
logger.trace("Refreshing "+this);}else{
logger.debug("Refreshing "+getDisplayName());}}// Initialize any placeholder property sources in the context environment.// 模板方法模式,用于子类重写。比如子类可以把ServletContext中的参数对设置到EnvironmentinitPropertySources();// Validate that all properties marked as required are resolvable:// see ConfigurablePropertyResolver#setRequiredProperties// 验证Environment有没有必须的key。通过Environment.setRequiredProperties("zhangwei")进行设置getEnvironment().validateRequiredProperties();// Store pre-refresh ApplicationListeners...// 监听器相关if(this.earlyApplicationListeners ==null){this.earlyApplicationListeners =newLinkedHashSet<>(this.applicationListeners);}else{// Reset local application listeners to pre-refresh state.this.applicationListeners.clear();this.applicationListeners.addAll(this.earlyApplicationListeners);}// Allow for the collection of early ApplicationEvents,// to be published once the multicaster is available...this.earlyApplicationEvents =newLinkedHashSet<>();}
准备BeanFactory源码分析
protectedvoidprepareBeanFactory(ConfigurableListableBeanFactory beanFactory){// Tell the internal bean factory to use the context's class loader etc.// 设置BeanFactory的类加载器
beanFactory.setBeanClassLoader(getClassLoader());// Spring5.3中新增的配置功能,可以选择是否开启Spel功能(EL表达式),shouldIgnoreSpel默认为false,表示开启。if(!shouldIgnoreSpel){
beanFactory.setBeanExpressionResolver(newStandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));}// 添加一个ResourceEditorRegistrar,注册一些级别的类型转化器
beanFactory.addPropertyEditorRegistrar(newResourceEditorRegistrar(this,getEnvironment()));// Configure the bean factory with context callbacks.// 组成一个BeanPostProcessor,用来处理EnvironmentAware、EmbeddedValueResolverAware等回调
beanFactory.addBeanPostProcessor(newApplicationContextAwareProcessor(this));// 如果一个属性对应的set方法在ignoredDependencyInterfaces接口中被定义了,则该属性不会进行自动注入(是Spring中的自动注入,不是@Autowired)
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);// BeanFactory interface not registered as resolvable type in a plain factory.// MessageSource registered (and found for autowiring) as a bean.// 指定一下Bean类型对应的具体Bean是什么
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class,this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class,this);
beanFactory.registerResolvableDependency(ApplicationContext.class,this);// Register early post-processor for detecting inner beans as ApplicationListeners.// ApplicationListenerDetector负责把ApplicantsListener类型的Bean注册到ApplicationContext中
beanFactory.addBeanPostProcessor(newApplicationListenerDetector(this));// Detect a LoadTimeWeaver and prepare for weaving, if found.// Aspectj本身是通过编译期进行代理的,在Spring中就跟LoadTimeWeaver有关if(!NativeDetector.inNativeImage()&& beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)){
beanFactory.addBeanPostProcessor(newLoadTimeWeaverAwareProcessor(beanFactory));// Set a temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(newContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}// Register default environment beans.// environment内部的几个类的具体Bean注册if(!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)){
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME,getEnvironment());}if(!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)){
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME,getEnvironment().getSystemProperties());}if(!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)){
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME,getEnvironment().getSystemEnvironment());}// 监控的Bean进行注册if(!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)){
beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME,getApplicationStartup());}}
最终的刷新方法:finishRefresh源码分析
protectedvoidfinishRefresh(){// Clear context-level resource caches (such as ASM metadata from scanning).// 清空和ASM相关的信息clearResourceCaches();// Initialize lifecycle processor for this context.// 监听spring容器的什么周期:设置lifecycleProcessor,默认为DefaultLifecycleProcessorinitLifecycleProcessor();// Propagate refresh to lifecycle processor first.// 调用LifecycleBean的start()getLifecycleProcessor().onRefresh();// Publish the final event.// 发布事件的监听器去监听这个事件publishEvent(newContextRefreshedEvent(this));// Participate in LiveBeansView MBean, if active.if(!NativeDetector.inNativeImage()){LiveBeansView.registerApplicationContext(this);}}