Springboot源码解读(一)

avatar
作者
猴君
阅读量:0

文章目录

1 项目搭建

1.1 构建Springboot项目

pom文件的内容如下:

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>      <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.2.11.RELEASE</version>         <relativePath/> <!-- lookup parent from repository -->     </parent>     <groupId>com.dream21th</groupId>     <artifactId>source-demo</artifactId>     <version>0.0.1-SNAPSHOT</version>     <name>source-code</name>     <description>Demo project for Spring Boot</description>      <properties>         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>         <java.version>1.8</java.version>     </properties>      <dependencies>         <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-web</artifactId>         </dependency>     </dependencies>      <build>         <plugins>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build>  </project>  

启动类如下:

package com.dream21th.sourcecode;  import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;  @SpringBootApplication public class SourceCodeApplication {      public static void main(String[] args) {         /**          * 启动类入口,通过run方法入口           * 下一步见:2 SpringApplication类          **/         SpringApplication.run(SourceCodeApplication.class,args);     } }  

项目结构只包含上面两个文件,作为最简单的Springboot项目启动分析实例。

2 SpringApplication类

类所在具体位置org.springframework.boot.SpringApplication

2.1 run方法

/** 	 * Static helper that can be used to run a {@link SpringApplication} from the 	 * specified source using default settings. 	 * @param primarySource the primary source to load 	 * @param args the application arguments (usually passed from a Java main method) 	 * @return the running {@link ApplicationContext} 	 */     /**       *SpringApplication的构造方法,primarySources为启动类的类名,args为项目启动参数       **/ 	public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) { 		return run(new Class<?>[] { primarySource }, args); 	} 
/** 	 * Static helper that can be used to run a {@link SpringApplication} from the 	 * specified sources using default settings and user supplied arguments. 	 * @param primarySources the primary sources to load 	 * @param args the application arguments (usually passed from a Java main method) 	 * @return the running {@link ApplicationContext} 	 */ 	public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {         /**          * new SpringApplication(primarySources) 见 2.2 SpringApplication构造方法          * run(args) 见:2.3          **/ 		return new SpringApplication(primarySources).run(args); 	} 

2.2 SpringApplication构造方法

/** 	 * Create a new {@link SpringApplication} instance. The application context will load 	 * beans from the specified primary sources (see {@link SpringApplication class-level} 	 * documentation for details. The instance can be customized before calling 	 * {@link #run(String...)}. 	 * @param primarySources the primary bean sources 	 * @see #run(Class, String[]) 	 * @see #SpringApplication(ResourceLoader, Class...) 	 * @see #setSources(Set) 	 */ 	public SpringApplication(Class<?>... primarySources) { 		this(null, primarySources); 	} 
/** 	 * Create a new {@link SpringApplication} instance. The application context will load 	 * beans from the specified primary sources (see {@link SpringApplication class-level} 	 * documentation for details. The instance can be customized before calling 	 * {@link #run(String...)}. 	 * @param resourceLoader the resource loader to use 	 * @param primarySources the primary bean sources 	 * @see #run(Class, String[]) 	 * @see #setSources(Set) 	 */ 	@SuppressWarnings({ "unchecked", "rawtypes" }) 	public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) { 		this.resourceLoader = resourceLoader; 		Assert.notNull(primarySources, "PrimarySources must not be null"); 		this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));         /**          * 获取Web容器的类型(SERVLET,NONE,REACTIVE)见 2.2.1 WebApplicationType类          **/ 		this.webApplicationType = WebApplicationType.deduceFromClasspath();         /**          * 1,getSpringFactoriesInstances(ApplicationContextInitializer.class),          * 获取项目中的所有ApplicationContextInitializer类型的类 见:2.2.2          * 2,setInitializers把获取的ApplicationContextInitializer类型的类的实例赋值给            initializers属性           **/ 		setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));         /**          * 1,getSpringFactoriesInstances(ApplicationListener.class),          * 获取项目中的所有ApplicationListener类型的类 见:2.2.2          * 2,setListeners把获取的ApplicationListener类型的类的实例赋值给listeners属性           **/ 		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));         /**          * 获取启动类 见2.2.3          **/ 		this.mainApplicationClass = deduceMainApplicationClass(); 	}  /** 	 * Sets the {@link ApplicationContextInitializer} that will be applied to the Spring 	 * {@link ApplicationContext}. 	 * @param initializers the initializers to set 	 */ 	public void setInitializers(Collection<? extends ApplicationContextInitializer<?>> initializers) { 		this.initializers = new ArrayList<>(initializers); 	}  	/** 	 * Sets the {@link ApplicationListener}s that will be applied to the SpringApplication 	 * and registered with the {@link ApplicationContext}. 	 * @param listeners the listeners to set 	 */ 	public void setListeners(Collection<? extends ApplicationListener<?>> listeners) { 		this.listeners = new ArrayList<>(listeners); 	} 

2.2.1 WebApplicationType类

org.springframework.boot.WebApplicationType,获取Web容器的类型,基本逻辑是:

​ 如果应用中包括org.springframework.web.servlet.DispatcherServletorg.glassfish.jersey.servlet.ServletContainer两个类并且没有org.springframework.web.servlet.DispatcherServlet类的时候,容器的方式为WebApplicationType.REACTIVE;

如果应用中没有javax.servlet.Servletorg.springframework.web.context.ConfigurableWebApplicationContext类的时候返回的容器类型为WebApplicationType.NONE;

其他情况返回WebApplicationType.SERVLET

本次调试容器的类型为WebApplicationType.SERVLET

private static final String[] SERVLET_INDICATOR_CLASSES = { "javax.servlet.Servlet", 			"org.springframework.web.context.ConfigurableWebApplicationContext" };  	private static final String WEBMVC_INDICATOR_CLASS = "org.springframework.web.servlet.DispatcherServlet";  	private static final String WEBFLUX_INDICATOR_CLASS = "org.springframework.web.reactive.DispatcherHandler";  	private static final String JERSEY_INDICATOR_CLASS = "org.glassfish.jersey.servlet.ServletContainer";  static WebApplicationType deduceFromClasspath() { 		if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null) 				&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) { 			return WebApplicationType.REACTIVE; 		} 		for (String className : SERVLET_INDICATOR_CLASSES) { 			if (!ClassUtils.isPresent(className, null)) { 				return WebApplicationType.NONE; 			} 		} 		return WebApplicationType.SERVLET; 	} 

2.2.2 getSpringFactoriesInstances方法

private <T> Collection<T> getSpringFactoriesInstances(Class<T> type) { 		return getSpringFactoriesInstances(type, new Class<?>[] {}); 	} 
	private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) { 		ClassLoader classLoader = getClassLoader(); 		// Use names and ensure unique to protect against duplicates         /**          * 加载资源路径下面的 spring.factories文件中配置的类  见:2.2.2.1 SpringFactoriesLoader类          **/ 		Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));         /**          * 实例化上面获取到类的实例 见:2.2.2.2          **/ 		List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);         /**          * 将获取到的实例排序          */ 		AnnotationAwareOrderComparator.sort(instances); 		return instances; 	} 
2.2.2.1 SpringFactoriesLoader类

org.springframework.core.io.support.SpringFactoriesLoader

读取META-INF/spring.factories文件,将数据保存MultiValueMap

	/** 	 * The location to look for factories. 	 * <p>Can be present in multiple JAR files. 	 */ 	public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";  /** 	 * Load the fully qualified class names of factory implementations of the 	 * given type from {@value #FACTORIES_RESOURCE_LOCATION}, using the given 	 * class loader. 	 * @param factoryType the interface or abstract class representing the factory 	 * @param classLoader the ClassLoader to use for loading resources; can be 	 * {@code null} to use the default 	 * @throws IllegalArgumentException if an error occurs while loading factory names 	 * @see #loadFactories 	 */ 	public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) { 		String factoryTypeName = factoryType.getName(); 		return loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList()); 	}  	private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) { 		MultiValueMap<String, String> result = cache.get(classLoader); 		if (result != null) { 			return result; 		}  		try { 			Enumeration<URL> urls = (classLoader != null ? 					classLoader.getResources(FACTORIES_RESOURCE_LOCATION) : 					ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION)); 			result = new LinkedMultiValueMap<>(); 			while (urls.hasMoreElements()) { 				URL url = urls.nextElement(); 				UrlResource resource = new UrlResource(url); 				Properties properties = PropertiesLoaderUtils.loadProperties(resource); 				for (Map.Entry<?, ?> entry : properties.entrySet()) { 					String factoryTypeName = ((String) entry.getKey()).trim(); 					for (String factoryImplementationName : StringUtils.commaDelimitedListToStringArray((String) entry.getValue())) { 						result.add(factoryTypeName, factoryImplementationName.trim()); 					} 				} 			} 			cache.put(classLoader, result); 			return result; 		} 		catch (IOException ex) { 			throw new IllegalArgumentException("Unable to load factories from location [" + 					FACTORIES_RESOURCE_LOCATION + "]", ex); 		} 	} 
2.2.2.2 createSpringFactoriesInstances方法

通过构造方法创建实例。

@SuppressWarnings("unchecked") 	private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, 			ClassLoader classLoader, Object[] args, Set<String> names) { 		List<T> instances = new ArrayList<>(names.size()); 		for (String name : names) { 			try { 				Class<?> instanceClass = ClassUtils.forName(name, classLoader); 				Assert.isAssignable(type, instanceClass); 				Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes); 				T instance = (T) BeanUtils.instantiateClass(constructor, args); 				instances.add(instance); 			} 			catch (Throwable ex) { 				throw new IllegalArgumentException("Cannot instantiate " + type + " : " + name, ex); 			} 		} 		return instances; 	} 

2.2.3 deduceMainApplicationClass方法

private Class<?> deduceMainApplicationClass() { 		try {             /**              * 获取运行线程的栈信息,遍历获取方法名为main的方法所在的类              **/ 			StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); 			for (StackTraceElement stackTraceElement : stackTrace) { 				if ("main".equals(stackTraceElement.getMethodName())) { 					return Class.forName(stackTraceElement.getClassName()); 				} 			} 		} 		catch (ClassNotFoundException ex) { 			// Swallow and continue 		} 		return null; 	} 

2.3 run(args)方法

/**  * Run the Spring application, creating and refreshing a new  * {@link ApplicationContext}.  * @param args the application arguments (usually passed from a Java main method)  * @return a running {@link ApplicationContext}  */ public ConfigurableApplicationContext run(String... args) {     /**       * 计时工具       **/    StopWatch stopWatch = new StopWatch();     /**      * 计时开始      **/    stopWatch.start();    ConfigurableApplicationContext context = null;    Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();    configureHeadlessProperty();     /**      * 获取项目中的所有SpringApplicationRunListeners,见:2.3.1      **/    SpringApplicationRunListeners listeners = getRunListeners(args);     /**       * 启动获取到的listeners       **/    listeners.starting();    try {       ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);       ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);       configureIgnoreBeanInfo(environment);        /**         * 打印banner         **/       Banner printedBanner = printBanner(environment);        /**          *获取容器上下文 见:2.3.2          **/       context = createApplicationContext();        /**         *获取spring.factories中的SpringBootExceptionReporter类型的类,构造入参ConfigurableApplicationContext.class         *详情见:2.2.2         **/       exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,             new Class[] { ConfigurableApplicationContext.class }, context);        /**         *准备上下文         **/       prepareContext(context, environment, listeners, applicationArguments, printedBanner);        /**          *刷新上下文 见:2.3.3          **/       refreshContext(context);        /**          *上下文刷新之后          **/       afterRefresh(context, applicationArguments);        /**         *计时结束         **/       stopWatch.stop();       if (this.logStartupInfo) {          new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);       }        /**          *启动获取到的listeners,入参为context          **/       listeners.started(context);        /**          *启动容器中的Runners 见2.3.4          **/       callRunners(context, applicationArguments);    }    catch (Throwable ex) {       handleRunFailure(context, ex, exceptionReporters, listeners);       throw new IllegalStateException(ex);    }     try {        /**          *执行获取到的listeners,入参为context          **/       listeners.running(context);    }    catch (Throwable ex) {       handleRunFailure(context, ex, exceptionReporters, null);       throw new IllegalStateException(ex);    }    return context; } 

2.3.1 getRunListeners方法

private SpringApplicationRunListeners getRunListeners(String[] args) {         /**           * SpringApplicationRunListener类的构造方法的参数           **/ 		Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class }; 		return new SpringApplicationRunListeners(logger,                 /**                   * 获取spring.factories配置文件中的SpringApplicationRunListener类,并通过                   * 入参是types的构造方法创建实例                   * 见2.2.2 getSpringFactoriesInstances方法解析                   **/ 				getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args)); 	} 

2.3.2 createApplicationContext方法

/** 	 * The class name of application context that will be used by default for non-web 	 * environments. 	 */ 	public static final String DEFAULT_CONTEXT_CLASS = "org.springframework.context." 			+ "annotation.AnnotationConfigApplicationContext";  	/** 	 * The class name of application context that will be used by default for web 	 * environments. 	 */ 	public static final String DEFAULT_SERVLET_WEB_CONTEXT_CLASS = "org.springframework.boot." 			+ "web.servlet.context.AnnotationConfigServletWebServerApplicationContext";  	/** 	 * The class name of application context that will be used by default for reactive web 	 * environments. 	 */ 	public static final String DEFAULT_REACTIVE_WEB_CONTEXT_CLASS = "org.springframework." 			+ "boot.web.reactive.context.AnnotationConfigReactiveWebServerApplicationContext";  /** 	 * Strategy method used to create the {@link ApplicationContext}. By default this 	 * method will respect any explicitly set application context or application context 	 * class before falling back to a suitable default. 	 * @return the application context (not yet refreshed) 	 * @see #setApplicationContextClass(Class) 	 */ 	protected ConfigurableApplicationContext createApplicationContext() { 		Class<?> contextClass = this.applicationContextClass; 		if (contextClass == null) { 			try { 				switch (this.webApplicationType) { 				case SERVLET: 					contextClass = Class.forName(DEFAULT_SERVLET_WEB_CONTEXT_CLASS); 					break; 				case REACTIVE: 					contextClass = Class.forName(DEFAULT_REACTIVE_WEB_CONTEXT_CLASS); 					break; 				default: 					contextClass = Class.forName(DEFAULT_CONTEXT_CLASS); 				} 			} 			catch (ClassNotFoundException ex) { 				throw new IllegalStateException( 						"Unable create a default ApplicationContext, please specify an ApplicationContextClass", ex); 			} 		} 		return (ConfigurableApplicationContext) BeanUtils.instantiateClass(contextClass); 	} 

根据Web容器的类型,初始化系统的ConfigurableApplicationContext类,容器的类型见2.2.1

本次容器中初始化的类org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext

通过BeanUtils.instantiateClass(contextClass)初始化,见:3.1。

2.3.3 refreshContext方法

private void refreshContext(ConfigurableApplicationContext context) { 		if (this.registerShutdownHook) { 			try { 				context.registerShutdownHook(); 			} 			catch (AccessControlException ex) { 				// Not allowed in some environments. 			} 		} 		refresh(context); 	} 
/** 	 * Refresh the underlying {@link ApplicationContext}. 	 * @param applicationContext the application context to refresh 	 */ 	protected void refresh(ApplicationContext applicationContext) {         /**           *见:3.2           **/ 		Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext); 		((AbstractApplicationContext) applicationContext).refresh(); 	} 

2.3.4 callRunners方法

找到人容器中的ApplicationRunnerCommandLineRunner的bean实例,然后分别运行。

private void callRunners(ApplicationContext context, ApplicationArguments args) { 		List<Object> runners = new ArrayList<>(); 		runners.addAll(context.getBeansOfType(ApplicationRunner.class).values()); 		runners.addAll(context.getBeansOfType(CommandLineRunner.class).values()); 		AnnotationAwareOrderComparator.sort(runners); 		for (Object runner : new LinkedHashSet<>(runners)) { 			if (runner instanceof ApplicationRunner) { 				callRunner((ApplicationRunner) runner, args); 			} 			if (runner instanceof CommandLineRunner) { 				callRunner((CommandLineRunner) runner, args); 			} 		} 	} 
private void callRunner(ApplicationRunner runner, ApplicationArguments args) { 		try { 			(runner).run(args); 		} 		catch (Exception ex) { 			throw new IllegalStateException("Failed to execute ApplicationRunner", ex); 		} 	} 

3 AnnotationConfigServletWebServerApplicationContext类

类所在具体位置org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext

3.1 类的初试化

3.1.1 无参构造方法

    private final AnnotatedBeanDefinitionReader reader;  	private final ClassPathBeanDefinitionScanner scanner; /** 	 * Create a new {@link AnnotationConfigServletWebServerApplicationContext} that needs 	 * to be populated through {@link #register} calls and then manually 	 * {@linkplain #refresh refreshed}. 	 */ 	public AnnotationConfigServletWebServerApplicationContext() {         /**           * 创建注解的bean定义的读取器 见 3.1.2           **/ 		this.reader = new AnnotatedBeanDefinitionReader(this);         /**           * 创建ClassPath路径下bean定义的扫描器 见 3.1.3           **/ 		this.scanner = new ClassPathBeanDefinitionScanner(this); 	} 

3.1.2 AnnotatedBeanDefinitionReader类

类所在具体位置org.springframework.context.annotation.AnnotatedBeanDefinitionReader

/** 	 * Create a new {@code AnnotatedBeanDefinitionReader} for the given registry. 	 * <p>If the registry is {@link EnvironmentCapable}, e.g. is an {@code ApplicationContext}, 	 * the {@link Environment} will be inherited, otherwise a new 	 * {@link StandardEnvironment} will be created and used. 	 * @param registry the {@code BeanFactory} to load bean definitions into, 	 * in the form of a {@code BeanDefinitionRegistry} 	 * @see #AnnotatedBeanDefinitionReader(BeanDefinitionRegistry, Environment) 	 * @see #setEnvironment(Environment) 	 */ 	public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {         /**           * getOrCreateEnvironment(registry)获取或者创建一个环境 见:3.1.2.1           **/ 		this(registry, getOrCreateEnvironment(registry)); 	}  	/** 	 * Create a new {@code AnnotatedBeanDefinitionReader} for the given registry, 	 * using the given {@link Environment}. 	 * @param registry the {@code BeanFactory} to load bean definitions into, 	 * in the form of a {@code BeanDefinitionRegistry} 	 * @param environment the {@code Environment} to use when evaluating bean definition 	 * profiles. 	 * @since 3.1 	 */ 	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);         /**           * 注册注解配置的处理器(Processors)见:3.1.2.2           **/ 		AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); 	} 
3.1.2.1 getOrCreateEnvironment
/** 	 * Get the Environment from the given registry if possible, otherwise return a new 	 * StandardEnvironment. 	 */ 	private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) { 		Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); 		if (registry instanceof EnvironmentCapable) { 			return ((EnvironmentCapable) registry).getEnvironment(); 		} 		return new StandardEnvironment(); 	} 
3.1.2.2 AnnotationConfigUtils类

类的所在位置org.springframework.context.annotation.AnnotationConfigUtils

/** 	 * Register all relevant annotation post processors in the given registry. 	 * @param registry the registry to operate on 	 */ 	public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) { 		registerAnnotationConfigProcessors(registry, null); 	} 
	/** 	 * The bean name of the internally managed Configuration annotation processor. 	 */ 	public static final String CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME = 			"org.springframework.context.annotation.internalConfigurationAnnotationProcessor";  	/** 	 * The bean name of the internally managed BeanNameGenerator for use when processing 	 * {@link Configuration} classes. Set by {@link AnnotationConfigApplicationContext} 	 * and {@code AnnotationConfigWebApplicationContext} during bootstrap in order to make 	 * any custom name generation strategy available to the underlying 	 * {@link ConfigurationClassPostProcessor}. 	 * @since 3.1.1 	 */ 	public static final String CONFIGURATION_BEAN_NAME_GENERATOR = 			"org.springframework.context.annotation.internalConfigurationBeanNameGenerator";  	/** 	 * The bean name of the internally managed Autowired annotation processor. 	 */ 	public static final String AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME = 			"org.springframework.context.annotation.internalAutowiredAnnotationProcessor";  	/** 	 * The bean name of the internally managed Required annotation processor. 	 * @deprecated as of 5.1, since no Required processor is registered by default anymore 	 */ 	@Deprecated 	public static final String REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME = 			"org.springframework.context.annotation.internalRequiredAnnotationProcessor";  	/** 	 * The bean name of the internally managed JSR-250 annotation processor. 	 */ 	public static final String COMMON_ANNOTATION_PROCESSOR_BEAN_NAME = 			"org.springframework.context.annotation.internalCommonAnnotationProcessor";  	/** 	 * The bean name of the internally managed JPA annotation processor. 	 */ 	public static final String PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME = 			"org.springframework.context.annotation.internalPersistenceAnnotationProcessor";  	private static final String PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME = 			"org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor";  	/** 	 * The bean name of the internally managed @EventListener annotation processor. 	 */ 	public static final String EVENT_LISTENER_PROCESSOR_BEAN_NAME = 			"org.springframework.context.event.internalEventListenerProcessor";  	/** 	 * The bean name of the internally managed EventListenerFactory. 	 */ 	public static final String EVENT_LISTENER_FACTORY_BEAN_NAME = 			"org.springframework.context.event.internalEventListenerFactory";  /** 	 * Register all relevant annotation post processors in the given registry. 	 * @param registry the registry to operate on 	 * @param source the configuration source element (already extracted) 	 * that this registration was triggered from. May be {@code null}. 	 * @return a Set of BeanDefinitionHolders, containing all bean definitions 	 * that have actually been registered by this call 	 */ 	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);  		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( 						"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex); 			} 			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; 	} 

上面代码执行完成后为讲下面五个处理器的定义加到容器中去:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor

org.springframework.context.annotation.internalAutowiredAnnotationProcessor

org.springframework.context.annotation.internalCommonAnnotationProcessor

org.springframework.context.event.internalEventListenerProcessor

org.springframework.context.event.internalEventListenerFactory

3.1.3 ClassPathBeanDefinitionScanner类

类所在具体位置org.springframework.context.annotation.ClassPathBeanDefinitionScanner

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) { 		this(registry, true); 	}  public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) { 		this(registry, useDefaultFilters, getOrCreateEnvironment(registry)); 	}  public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters, 			Environment environment) {  		this(registry, useDefaultFilters, environment, 				(registry instanceof ResourceLoader ? (ResourceLoader) registry : null)); 	}  public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters, 			Environment environment, @Nullable ResourceLoader resourceLoader) {  		Assert.notNull(registry, "BeanDefinitionRegistry must not be null"); 		this.registry = registry;         /**           *通过useDefaultFilters来确定是否使用默认的filters           **/ 		if (useDefaultFilters) {             /**               *注册默认的filters 见:3.1.3.1               **/ 			registerDefaultFilters(); 		} 		setEnvironment(environment); 		setResourceLoader(resourceLoader); 	} 
3.1.3.1 registerDefaultFilters方法
/** 	 * Register the default filter for {@link Component @Component}. 	 * <p>This will implicitly register all annotations that have the 	 * {@link Component @Component} meta-annotation including the 	 * {@link Repository @Repository}, {@link Service @Service}, and 	 * {@link Controller @Controller} stereotype annotations. 	 * <p>Also supports Java EE 6's {@link javax.annotation.ManagedBean} and 	 * JSR-330's {@link javax.inject.Named} annotations, if available. 	 * 	 */ 	@SuppressWarnings("unchecked") 	protected void registerDefaultFilters() {         /**           * 讲Component类加到filters中           **/ 		this.includeFilters.add(new AnnotationTypeFilter(Component.class)); 		ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader(); 		try {             /**               * 讲JSR-250规范加到filters中               **/ 			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 {             /**               * 讲JSR-330规范加到filters中               **/ 			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. 		} 	} 

3.2 refresh方法

方法所在类org.springframework.context.support.AbstractApplicationContext

@Override 	public void refresh() throws BeansException, IllegalStateException { 		synchronized (this.startupShutdownMonitor) { 			// Prepare this context for refreshing.             /**               * 刷新上下文前准备 见:3.2.1               **/ 			prepareRefresh();  			// Tell the subclass to refresh the internal bean factory.             /**               *获取刷新的BeanFactory 见:3.2.2               **/ 			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();  			// Prepare the bean factory for use in this context.             /**               *准备BeanFactory 见:3.2.3               **/ 			prepareBeanFactory(beanFactory);  			try { 				// Allows post-processing of the bean factory in context subclasses.                 /**                   * 后置处理器的bean工厂 见:3.2.4                   **/ 				postProcessBeanFactory(beanFactory);  				// Invoke factory processors registered as beans in the context.                 /**                   * 将factory processors生成bean注册到上下文中 见:3.2.5                   **/ 				invokeBeanFactoryPostProcessors(beanFactory);  				// Register bean processors that intercept bean creation. 				registerBeanPostProcessors(beanFactory);  				// Initialize message source for this context. 				initMessageSource();  				// Initialize event multicaster for this context. 				initApplicationEventMulticaster();  				// Initialize other special beans in specific context subclasses. 				onRefresh();  				// Check for listener beans and register them. 				registerListeners();  				// Instantiate all remaining (non-lazy-init) singletons. 				finishBeanFactoryInitialization(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(); 			} 		} 	} 

3.2.1 prepareRefresh方法

/** 	 * Prepare this context for refreshing, setting its startup date and 	 * active flag as well as performing any initialization of property sources. 	 */ 	protected void prepareRefresh() { 		// 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. 		initPropertySources();  		// Validate that all properties marked as required are resolvable: 		// see ConfigurablePropertyResolver#setRequiredProperties 		getEnvironment().validateRequiredProperties();  		// Store pre-refresh ApplicationListeners... 		if (this.earlyApplicationListeners == null) { 			this.earlyApplicationListeners = new LinkedHashSet<>(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 = new LinkedHashSet<>(); 	}  

3.2.2 obtainFreshBeanFactory方法

/** 	 * Tell the subclass to refresh the internal bean factory. 	 * @return the fresh BeanFactory instance 	 * @see #refreshBeanFactory() 	 * @see #getBeanFactory() 	 */ 	protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { 		refreshBeanFactory(); 		return getBeanFactory(); 	} 

3.2.3 prepareBeanFactory方法

/** 	 * Configure the factory's standard context characteristics, 	 * such as the context's ClassLoader and post-processors. 	 * @param beanFactory the BeanFactory to configure 	 */ 	protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { 		// Tell the internal bean factory to use the context's class loader etc.         /**           * 设置beanFactory的类加载器           **/ 		beanFactory.setBeanClassLoader(getClassLoader());         /**           * 设置beanFactory的EL表达式           **/ 		beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader())); 		beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));  		// Configure the bean factory with context callbacks.         /**           * 往beanFactory增加ApplicationContextAwareProcessor处理器           **/ 		beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));         /**           * beanFactory中增加忽略的接口           **/ 		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 interface not registered as resolvable type in a plain factory. 		// MessageSource registered (and found for autowiring) as a bean.         /**           * beanFactory中注册需要解决的依赖           **/ 		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. 		beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));  		// Detect a LoadTimeWeaver and prepare for weaving, if found. 		if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { 			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); 			// Set a temporary ClassLoader for type matching. 			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); 		}  		// Register default environment beans.         /**           *注册默认的环境beans           **/ 		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()); 		} 	} 

3.2.4 postProcessBeanFactory方法

没有指定的话this.basePackagesthis.annotatedClasses为空

    @Override 	protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { 		/** 		  *调父类的postProcessBeanFactory方法 见:3.2.4.1 		  **/         super.postProcessBeanFactory(beanFactory); 		if (this.basePackages != null && this.basePackages.length > 0) { 			this.scanner.scan(this.basePackages); 		} 		if (!this.annotatedClasses.isEmpty()) { 			this.reader.register(ClassUtils.toClassArray(this.annotatedClasses)); 		} 	} 
3.2.4.1 父类postProcessBeanFactory方法
/** 	 * Register ServletContextAwareProcessor. 	 * @see ServletContextAwareProcessor 	 */ 	@Override 	protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {         /**           *beanFactory中注册WebApplicationContextServletContextAwareProcessor处理器           **/ 		beanFactory.addBeanPostProcessor(new WebApplicationContextServletContextAwareProcessor(this));         /**           * 忽略ServletContextAware接口           **/ 		beanFactory.ignoreDependencyInterface(ServletContextAware.class);         /**           *注册容器的作用域 见:3.2.4.1.1           **/ 		registerWebApplicationScopes(); 	} 
3.2.4.1.1 registerWebApplicationScopes方法
private void registerWebApplicationScopes() {         /**           *创建已经存在的Web应用作用域类           **/ 		ExistingWebApplicationScopes existingScopes = new ExistingWebApplicationScopes(getBeanFactory());         /**           * 注册Web应用作用域 见:3.2.4.1.1.1           **/ 		WebApplicationContextUtils.registerWebApplicationScopes(getBeanFactory());         /**           * 注册实例 见:3.2.4.1.1.2           **/ 		existingScopes.restore(); 	} 
3.2.4.1.1.1 registerWebApplicationScopes方法
/** 	 * Register web-specific scopes ("request", "session", "globalSession") 	 * with the given BeanFactory, as used by the WebApplicationContext. 	 * @param beanFactory the BeanFactory to configure 	 */ 	public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory) { 		registerWebApplicationScopes(beanFactory, null); 	} 
/** 	 * Register web-specific scopes ("request", "session", "globalSession", "application") 	 * with the given BeanFactory, as used by the WebApplicationContext. 	 * @param beanFactory the BeanFactory to configure 	 * @param sc the ServletContext that we're running within 	 */ 	public static void registerWebApplicationScopes(ConfigurableListableBeanFactory beanFactory, 			@Nullable ServletContext sc) {         /**           * 注册request作用域           **/ 		beanFactory.registerScope(WebApplicationContext.SCOPE_REQUEST, new RequestScope());          /**           * 注册session作用域           **/ 		beanFactory.registerScope(WebApplicationContext.SCOPE_SESSION, new SessionScope()); 		if (sc != null) { 			ServletContextScope appScope = new ServletContextScope(sc); 			beanFactory.registerScope(WebApplicationContext.SCOPE_APPLICATION, appScope); 			// Register as ServletContext attribute, for ContextCleanupListener to detect it. 			sc.setAttribute(ServletContextScope.class.getName(), appScope); 		}         /**           * 注册ServletRequest类的实例           **/ 		beanFactory.registerResolvableDependency(ServletRequest.class, new RequestObjectFactory()); 		beanFactory.registerResolvableDependency(ServletResponse.class, new ResponseObjectFactory()); 		beanFactory.registerResolvableDependency(HttpSession.class, new SessionObjectFactory()); 		beanFactory.registerResolvableDependency(WebRequest.class, new WebRequestObjectFactory()); 		if (jsfPresent) { 			FacesDependencyRegistrar.registerFacesDependencies(beanFactory); 		} 	} 
3.2.4.1.1.2 restore方法
public void restore() { 			this.scopes.forEach((key, value) -> { 				if (logger.isInfoEnabled()) { 					logger.info("Restoring user defined scope " + key); 				} 				this.beanFactory.registerScope(key, value); 			}); 		} 

3.2.5 invokeBeanFactoryPostProcessors方法

/** 	 * Instantiate and invoke all registered BeanFactoryPostProcessor beans, 	 * respecting explicit order if given. 	 * <p>Must be called before singleton instantiation. 	 */ 	protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {         /**           * 见:3.2.5.1           **/ 		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 (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) { 			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory)); 			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader())); 		} 	} 
3.2.5.1 PostProcessorRegistrationDelegate类

beanFactoryPostProcessors加载到了三个实例(这三个类都是类部类):

org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer.CachingMetadataReaderFactoryPostProcessor

org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer.ConfigurationWarningsPostProcessor

org.springframework.boot.context.config.ConfigFileApplicationListener.PropertySourceOrderingPostProcessor

postProcessorNames这里只包含一个类的名字:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor,并且这个类实现了PriorityOrdered接口;

beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)获取上面类的实例并放到容器中。

public static void invokeBeanFactoryPostProcessors( 			ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {  		// Invoke BeanDefinitionRegistryPostProcessors first, if any. 		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;                     /**                       * 后置处理器定义注册器 见:3.2.5.1.1;3.2.5.1.2                       **/ 					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接口的BeanDefinitionRegistryPostProcessors类               **/ 			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);             /**               *执行bean定义注册器的后置处理器 见:3.2.5.1.3               **/ 			invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); 			currentRegistryProcessors.clear();  			// Next, invoke the BeanDefinitionRegistryPostProcessors that implement Ordered. 			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); 			currentRegistryProcessors.clear();  			// Finally, invoke all other BeanDefinitionRegistryPostProcessors until no further ones appear. 			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); 				currentRegistryProcessors.clear(); 			}  			// Now, invoke the postProcessBeanFactory callback of all processors handled so far. 			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! 		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(); 	}  
3.2.5.1.1 CachingMetadataReaderFactoryPostProcessor类
	public static final String BEAN_NAME = "org.springframework.boot.autoconfigure." 			+ "internalCachingMetadataReaderFactory";  /** 	 * {@link BeanDefinitionRegistryPostProcessor} to register the 	 * {@link CachingMetadataReaderFactory} and configure the 	 * {@link ConfigurationClassPostProcessor}. 	 */ 	private static class CachingMetadataReaderFactoryPostProcessor 			implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {  		@Override 		public int getOrder() { 			// Must happen before the ConfigurationClassPostProcessor is created 			return Ordered.HIGHEST_PRECEDENCE; 		}  		@Override 		public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 		}  		@Override 		public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 			register(registry); 			configureConfigurationClassPostProcessor(registry); 		}  		private void register(BeanDefinitionRegistry registry) {             /**               * 创建BEAN_NAME的bean定义               **/ 			BeanDefinition definition = BeanDefinitionBuilder 					.genericBeanDefinition(SharedMetadataReaderFactoryBean.class, SharedMetadataReaderFactoryBean::new) 					.getBeanDefinition(); 			registry.registerBeanDefinition(BEAN_NAME, definition); 		}  		private void configureConfigurationClassPostProcessor(BeanDefinitionRegistry registry) { 			try {                 /**                   * 给CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME这个bean定义增加一个metadataReaderFactory的属性                   **/ 				BeanDefinition definition = registry 						.getBeanDefinition(AnnotationConfigUtils.CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME); 				definition.getPropertyValues().add("metadataReaderFactory", new RuntimeBeanReference(BEAN_NAME)); 			} 			catch (NoSuchBeanDefinitionException ex) { 			} 		}  	} 
3.2.5.1.2 ConfigurationWarningsPostProcessor类
/** 	 * {@link BeanDefinitionRegistryPostProcessor} to report warnings. 	 */ 	protected static final class ConfigurationWarningsPostProcessor 			implements PriorityOrdered, BeanDefinitionRegistryPostProcessor {  		private Check[] checks;  		public ConfigurationWarningsPostProcessor(Check[] checks) { 			this.checks = checks; 		}  		@Override 		public int getOrder() { 			return Ordered.LOWEST_PRECEDENCE - 1; 		}  		@Override 		public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 		}  		@Override 		public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { 			for (Check check : this.checks) { 				String message = check.getWarning(registry); 				if (StringUtils.hasLength(message)) { 					warn(message); 				} 			}  		}  		private void warn(String message) { 			if (logger.isWarnEnabled()) { 				logger.warn(String.format("%n%n** WARNING ** : %s%n%n", message)); 			} 		}  	}  
3.2.5.1.3 invokeBeanDefinitionRegistryPostProcessors方法
/** 	 * Invoke the given BeanDefinitionRegistryPostProcessor beans. 	 */ 	private static void invokeBeanDefinitionRegistryPostProcessors( 			Collection<? extends BeanDefinitionRegistryPostProcessor> postProcessors, BeanDefinitionRegistry registry) {  		for (BeanDefinitionRegistryPostProcessor postProcessor : postProcessors) { 			postProcessor.postProcessBeanDefinitionRegistry(registry); 		} 	} 

postProcessBeanDefinitionRegistry方法

/** 	 * Derive further bean definitions from the configuration classes in the registry. 	 */ 	@Override 	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { 		int registryId = System.identityHashCode(registry); 		if (this.registriesPostProcessed.contains(registryId)) { 			throw new IllegalStateException( 					"postProcessBeanDefinitionRegistry already called on this post-processor against " + registry); 		} 		if (this.factoriesPostProcessed.contains(registryId)) { 			throw new IllegalStateException( 					"postProcessBeanFactory already called on this post-processor against " + registry); 		} 		this.registriesPostProcessed.add(registryId);  		processConfigBeanDefinitions(registry); 	}  

processConfigBeanDefinitions方法

candidateNames中的类有七个:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor

org.springframework.context.annotation.internalAutowiredAnnotationProcessor

org.springframework.context.annotation.internalCommonAnnotationProcessor

org.springframework.context.event.internalEventListenerProcessor

org.springframework.context.event.internalEventListenerFactory

sourceCodeApplication

org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory

经过过滤以后candidateNames中只包含sourceCodeApplication

/** 	 * Build and validate a configuration model based on the registry of 	 * {@link Configuration} classes. 	 */ 	public void processConfigBeanDefinitions(BeanDefinitionRegistry registry) { 		List<BeanDefinitionHolder> configCandidates = new ArrayList<>(); 		String[] candidateNames = registry.getBeanDefinitionNames();  		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 		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 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 {             /**               * 解析配置文件 见3.2.5.1.3.1               **/ 			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()); 			}             /**               * 加载所有配置类下面的bean               **/ 			this.reader.loadBeanDefinitions(configClasses); 			alreadyParsed.addAll(configClasses);  			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(); 		} 	}  
3.2.5.1.3.1 parse方法

所在类org.springframework.context.annotation.ConfigurationClassParser

	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(); 	} 
	protected final void parse(AnnotationMetadata metadata, String beanName) throws IOException { 		processConfigurationClass(new ConfigurationClass(metadata, beanName), DEFAULT_EXCLUSION_FILTER); 	} 
protected void processConfigurationClass(ConfigurationClass configClass, Predicate<String> filter) throws IOException {         /**           *判断该类是否需要加载到容器           **/ 		if (this.conditionEvaluator.shouldSkip(configClass.getMetadata(), ConfigurationPhase.PARSE_CONFIGURATION)) { 			return; 		}  		ConfigurationClass existingClass = this.configurationClasses.get(configClass); 		if (existingClass != null) { 			if (configClass.isImported()) { 				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. 				this.configurationClasses.remove(configClass); 				this.knownSuperclasses.values().removeIf(configClass::equals); 			} 		}  		// Recursively process the configuration class and its superclass hierarchy.        /**          *递归处理配置类及其父类          **/ 		SourceClass sourceClass = asSourceClass(configClass, filter); 		do { 			sourceClass = doProcessConfigurationClass(configClass, sourceClass, filter); 		} 		while (sourceClass != null);  		this.configurationClasses.put(configClass, configClass); 	} 
@Nullable 	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 		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         /**           * 扫描所有的@ComponentScan注解           **/ 		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                      /**                   * 解析扫描包下面的配置类 见 3.2.5.1.3.1.1                   **/ 				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)) { 						parse(bdCand.getBeanClassName(), holder.getBeanName()); 					} 				} 			} 		}  		// Process any @Import annotations 		processImports(configClass, sourceClass, getImports(sourceClass), filter, true);  		// Process any @ImportResource annotations 		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 		Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass); 		for (MethodMetadata methodMetadata : beanMethods) { 			configClass.addBeanMethod(new BeanMethod(methodMetadata, configClass)); 		}  		// Process default methods on interfaces 		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; 	}  

3.2.5.1.3.1.1 componentScanParser的parse方法

	public Set<BeanDefinitionHolder> parse(AnnotationAttributes componentScan, final 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 filter : componentScan.getAnnotationArray("includeFilters")) { 			for (TypeFilter typeFilter : typeFiltersFor(filter)) { 				scanner.addIncludeFilter(typeFilter); 			} 		} 		for (AnnotationAttributes filter : componentScan.getAnnotationArray("excludeFilters")) { 			for (TypeFilter typeFilter : typeFiltersFor(filter)) { 				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)); 	} 
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注解的类               **/ 			Set<BeanDefinition> candidates = findCandidateComponents(basePackage); 			for (BeanDefinition candidate : candidates) { 				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) { 					AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate); 				} 				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; 	} 
public Set<BeanDefinition> findCandidateComponents(String basePackage) { 		if (this.componentsIndex != null && indexSupportsIncludeFilters()) { 			return addCandidateComponentsFromIndex(this.componentsIndex, basePackage); 		} 		else { 			return scanCandidateComponents(basePackage); 		} 	} 
private Set<BeanDefinition> scanCandidateComponents(String basePackage) { 		Set<BeanDefinition> candidates = new LinkedHashSet<>(); 		try { 			String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + 					resolveBasePackage(basePackage) + '/' + this.resourcePattern; 			Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath); 			boolean traceEnabled = logger.isTraceEnabled(); 			boolean debugEnabled = logger.isDebugEnabled(); 			for (Resource resource : resources) { 				if (traceEnabled) { 					logger.trace("Scanning " + resource); 				} 				if (resource.isReadable()) { 					try { 						MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource); 						if (isCandidateComponent(metadataReader)) { 							ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader); 							sbd.setSource(resource);                             /**                               * 是否候选的组件                               **/ 							if (isCandidateComponent(sbd)) { 								if (debugEnabled) { 									logger.debug("Identified candidate component class: " + resource); 								} 								candidates.add(sbd); 							} 							else { 								if (debugEnabled) { 									logger.debug("Ignored because not a concrete top-level class: " + resource); 								} 							} 						} 						else { 							if (traceEnabled) { 								logger.trace("Ignored because not matching any filter: " + resource); 							} 						} 					} 					catch (Throwable ex) { 						throw new BeanDefinitionStoreException( 								"Failed to read candidate component class: " + resource, ex); 					} 				} 				else { 					if (traceEnabled) { 						logger.trace("Ignored because not readable: " + resource); 					} 				} 			} 		} 		catch (IOException ex) { 			throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex); 		} 		return candidates; 	} 
protected boolean isCandidateComponent(MetadataReader metadataReader) throws IOException { 		for (TypeFilter tf : this.excludeFilters) { 			if (tf.match(metadataReader, getMetadataReaderFactory())) { 				return false; 			} 		} 		for (TypeFilter tf : this.includeFilters) { 			if (tf.match(metadataReader, getMetadataReaderFactory())) { 				return isConditionMatch(metadataReader); 			} 		} 		return false; 	} 

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!