自动装配
SpringBootApplication
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//将当前类标记为配置类,可以注入Bean
@SpringBootConfiguration
//自动导入代码
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
流程图
SpringBootConfiguration
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
//配置类注解
@Configuration
public @interface SpringBootConfiguration {
-
自动装配
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//获取SpringBootApplication注解的配置类
@AutoConfigurationPackage
//扫描spring.factories配置类,获取自动装配bean
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
-
AutoConfigurationPackage
/**
* {@link ImportBeanDefinitionRegistrar} to store the base package from the importing
* configuration.
*/
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
//解析SpringBootApplication注解类的包路径,并注册到BeanDefinition
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
private final List<String> packageNames;
PackageImports(AnnotationMetadata metadata) {
//获取AutoConfigurationPackage注解字段变量
AnnotationAttributes attributes = AnnotationAttributes
.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));
List<String> packageNames = new ArrayList<>();
//获取basePackages属性
for (String basePackage : attributes.getStringArray("basePackages")) {
packageNames.add(basePackage);
}
//获取basePackageClasses属性
for (Class<?> basePackageClass : attributes.getClassArray("basePackageClasses")) {
packageNames.add(basePackageClass.getPackage().getName());
}
//上面2个属性没有配置,获取当前注解所在类的包路径
if (packageNames.isEmpty()) {
packageNames.add(ClassUtils.getPackageName(metadata.getClassName()));
}
this.packageNames = Collections.unmodifiableList(packageNames);
}
public static void register(BeanDefinitionRegistry registry, String... packageNames) {
if (registry.containsBeanDefinition(BEAN)) {
BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN);
ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues();
constructorArguments.addIndexedArgumentValue(0, addBasePackages(constructorArguments, packageNames));
}
else {
//注册BasePackages到beanDefinition,后续由spring加载实例化bean
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(BasePackages.class);
beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, packageNames);
beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
registry.registerBeanDefinition(BEAN, beanDefinition);
}
}
-
AutoConfigurationImportSelector
实现ImportSelector的类,springboot会在启动的时候加载selectImports返回的class
public interface ImportSelector {
//springboot会在启动时实例化数组返回的class
String[] selectImports(AnnotationMetadata importingClassMetadata);
@Nullable
default Predicate<String> getExclusionFilter() {
return null;
}
}
加载spring.factories文件下的所有EnableAutoConfiguration的类路径
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
//判断当前环境变量是否设置允许自动装配spring.boot.enableautoconfiguration
if (!isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
}
//获取EnableAutoConfiguration注解的属性配置
AnnotationAttributes attributes = getAttributes(annotationMetadata);
//扫描所有jar包下的meta-inf下的spring.factories里的自动装配类列表EnableAutoConfiguration
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
//去重重复配置类
configurations = removeDuplicates(configurations);
//获取注解,环境变量配置的需要剔除的自动装配类
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
//检查自动装配类里是否包含需要剔除的类,不包含,则报错
checkExcludedClasses(configurations, exclusions);
//删掉需要剔除的类
configurations.removeAll(exclusions);
//获取OnBeanCondition以及OnClassCondition,对自动装配的bean有条件依赖的进行过滤
//读取META-INF/spring-autoconfigure-metadata.properties下类的依赖关系
/**
例如open-feign源码里的
org.springframework.cloud.openfeign.FeignAutoConfiguration.ConditionalOnClass=feign.Feign
**/
configurations = getConfigurationClassFilter().filter(configurations);
fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationEntry(configurations, exclusions);
}
@Override
public Iterable<Entry> selectImports() {
if (this.autoConfigurationEntries.isEmpty()) {
return Collections.emptyList();
}
//获取需要剔除的类
Set<String> allExclusions = this.autoConfigurationEntries.stream()
.map(AutoConfigurationEntry::getExclusions).flatMap(Collection::stream).collect(Collectors.toSet());
//获取所有需要自动装配的类
Set<String> processedConfigurations = this.autoConfigurationEntries.stream()
.map(AutoConfigurationEntry::getConfigurations).flatMap(Collection::stream)
.collect(Collectors.toCollection(LinkedHashSet::new));
//再剔除一遍
processedConfigurations.removeAll(allExclusions);
//排序返回,由spring加载bean
return sortAutoConfigurations(processedConfigurations, getAutoConfigurationMetadata()).stream()
.map((importClassName) -> new Entry(this.entries.get(importClassName), importClassName))
.collect(Collectors.toList());
}
至此springboot的自动装配已经全部结束
启动流程
SpringApplication
-
SpringApplication.run
public static void main(String[] args) {
//启动入口类
SpringApplication.run(RecommendApiApplication.class);
}
-
实例化SpringApplication,设置相关属性值
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
//将启动类class添加到set集合中
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
//根据class判断当前web类型,1.servlet原始web 2.REACTIVE webflux响应式
this.webApplicationType = WebApplicationType.deduceFromClasspath();
//从spring.factories获取ApplicationContextInitializer的实现类,并实例化
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
//从spring.factories获取ApplicationListener的实现类,并实例化
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
-
run方法主要逻辑
public ConfigurableApplicationContext run(String... args) {
//启动耗时统计
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ConfigurableApplicationContext context = null;
Collection<SpringBootExceptionReporter> exceptionReporters = new ArrayList<>();
configureHeadlessProperty();
//从spring.factories获取SpringApplicationRunListener的实现,并实例化
SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting();
try {
//读取运行参数
ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
//创建环境并配置相关属性
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
//不深究
configureIgnoreBeanInfo(environment);
//banner图标打印
Banner printedBanner = printBanner(environment);
//创建AnnotationConfigServletWebServerApplicationContext上下文
// 此处很关键,无参构造方法
/**
public AnnotationConfigServletWebServerApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
此处会将ConfigurationClassPostProcessor注册到DefaultListableBeanFactory里的
BeanDefinition里
从而调用getBeanNamesForType会取ConfigurationClassPostProcessor(见6.2invokeBeanFactoryPostProcessors)
详细实现在AnnotatedBeanDefinitionReader构造方法
**/
context = createApplicationContext();
//spring.factories读取配配置
exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class,
new Class[] { ConfigurableApplicationContext.class }, context);
//上下文前置操作
prepareContext(context, environment, listeners, applicationArguments, printedBanner);
//刷新上下文
refreshContext(context);
afterRefresh(context, applicationArguments);
stopWatch.stop();
if (this.logStartupInfo) {
new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch);
}
listeners.started(context);
callRunners(context, applicationArguments);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, listeners);
throw new IllegalStateException(ex);
}
try {
listeners.running(context);
}
catch (Throwable ex) {
handleRunFailure(context, ex, exceptionReporters, null);
throw new IllegalStateException(ex);
}
return context;
}
-
prepareEnvironment
private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,
ApplicationArguments applicationArguments) {
/**
创建环境变量
添加servletContextInitParams,servletConfigInitParams等配置
到MutablePropertySources,value暂时为空
**/
ConfigurableEnvironment environment = getOrCreateEnvironment();
configureEnvironment(environment, applicationArguments.getSourceArgs());
ConfigurationPropertySources.attach(environment);
//为listeners设置environment环境变量
listeners.environmentPrepared(environment);
bindToSpringApplication(environment);
if (!this.isCustomEnvironment) {
environment = new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,
deduceEnvironmentClass());
}
ConfigurationPropertySources.attach(environment);
return environment;
}
-
prepareContext
private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment,
SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) {
//设置上下文环境变量
context.setEnvironment(environment);
//注册bean以及设置相关属性
postProcessApplicationContext(context);
//为ApplicationContextInitializer设置上下文context
applyInitializers(context);
//为listener设置context
listeners.contextPrepared(context);
//记录启动日志
if (this.logStartupInfo) {
logStartupInfo(context.getParent() == null);
logStartupProfileInfo(context);
}
// 添加一些单例子bean
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
beanFactory.registerSingleton("springApplicationArguments", applicationArguments);
if (printedBanner != null) {
beanFactory.registerSingleton("springBootBanner", printedBanner);
}
if (beanFactory instanceof DefaultListableBeanFactory) {
((DefaultListableBeanFactory) beanFactory)
.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
}
if (this.lazyInitialization) {
context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());
}
// 获取启动类
Set<Object> sources = getAllSources();
Assert.notEmpty(sources, "Sources must not be empty");
//将启动类bean注册到BeanDefinition
load(context, sources.toArray(new Object[0]));
listeners.contextLoaded(context);
}
-
refresh方法
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
/**
1.设置开始时间
2.调用StandardServletEnvironment的initPropertySources方法
3.校验一些关键的环境信息是否存在
**/
prepareRefresh();
/**
1.为DefaultListableBeanFactory设置序列化id
2.获取创建context时候创建的DefaultListableBeanFactory对象
**/
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 为bean设置一些属性
prepareBeanFactory(beanFactory);
try {
/**
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
//添加WebApplicationContextServletContextAwareProcessor后置加载启
beanFactory.addBeanPostProcessor(new WebApplicationContextServletContextAwareProcessor(this));
//添加忽略自动加载class
beanFactory.ignoreDependencyInterface(ServletContextAware.class);
registerWebApplicationScopes();
}
**/
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
// 调用所有的BeanFactoryPostProcessors实现类,将结果存入参数beanFactory中
//调用BeanDefinitionRegistryPostProcessor实现类(受spring管理),将需要装配的bean加载到BeanDefinition
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.
// 留给子类类初始化其他的bean
onRefresh();
// Check for listener beans and register them.
// 注册监听器
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
// 初始化剩下的单例bean,在这里才开始真正的对bean进行实例化和初始化( 重要 )
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();
}
}
}
-
prepareBeanFactory
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 设置beanFactory的classLoader
beanFactory.setBeanClassLoader(getClassLoader());
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// 添加BeanPostProcessor
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
//添加忽略自动装配的接口列表
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
/**
将下面bean塞到resolvableDependencies的map里,后面使用
**/
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
// 添加BeanPostProcessor
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()));
}
// 注册环境变量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());
}
}
-
invokeBeanFactoryPostProcessors
/**
当前方法的作用
1.获取prepareContext处加载的beanFactoryPostProcessors(applyInitializers方法,最终调用
addBeanFactoryPostProcessor)
2.筛选出继承BeanDefinitionRegistryPostProcessor的类
3.分别找出接口BeanDefinitionRegistryPostProcessor的受spring管理的子类,并且继承了
PriorityOrdered和Ordered的类,排序后,执行回调方法
4.BeanDefinitionRegistryPostProcessor的子类注入BeanDefinition的过程主要在3.run方法
createApplicationContext的构造方法里实现
**/
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// Invoke BeanDefinitionRegistryPostProcessors first, if any.
Set<String> processedBeans = new HashSet<>();
//判断beanFactory是否是BeanDefinitionRegistry接口的实现类(是)
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
//BeanFactoryPostProcessor接口实现列表
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
//BeanDefinitionRegistryPostProcessor接口实现列表
//BeanDefinitionRegistryPostProcessor实现BeanFactoryPostProcessor
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
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<>();
// 获取BeanDefinitionRegistryPostProcessor类的所有子类名称
// 受spring管理的类
// 此处为ConfigurationClassPostProcessor
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
// 判断当前类是否是实现了PriorityOrdered
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 获取bean,没有则创建bean
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
// 实现PriorityOrdered和BeanDefinitionRegistryPostProcessor接口的类
// 排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
// 执行BeanDefinitionRegistryPostProcessor实现类的postProcessBeanDefinitionRegistry
// 方法,此处很关键
// ConfigurationClassPostProcessor类会扫描所有注解类,并注册到BeanDefinition
// 后期创建bean(@Controller,@Service,@Componetn等)
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
// 获取BeanDefinitionRegistryPostProcessor类的所有bean
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();
}
-
registerBeanPostProcessors
/**
当前方法的作用,
1.获取实现了BeanPostProcessor接口的并且受spring管理的类
2.获取实现PriorityOrdered的接口实现类,排序,然后注册到DefaultListableBeanfactory中
3.获取实现了Ordered的接口实现类,排序,然后注册到DefaultListableBeanfactory中
4.剩下的类注册到beanFactory中
5.beanFactory在bean创建的时候会回调当前方法
**/
public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// 获取 BeanPostProcessor接口的实现类,并且受spring管理的类
//(注册到BeanDefinition的类)
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// Separate between BeanPostProcessors that implement PriorityOrdered,
// Ordered, and the rest.
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
// 2.1获取PriorityOrdered接口的实现类
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
// 2.2同时实现了MergedBeanDefinitionPostProcessor,添加到新集合
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
// 3.1获取实现了Ordered的实现类
orderedPostProcessorNames.add(ppName);
}
else {
// 4.1处理剩下的类
nonOrderedPostProcessorNames.add(ppName);
}
}
// 2.3排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
// 2.4注册到beanFactory的List<BeanPostProcessor> beanPostProcessors集合中
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 3.2同时获取实现了MergedBeanDefinitionPostProcessor,添加到新集合
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 3.3排序ordered
sortPostProcessors(orderedPostProcessors, beanFactory);
// 3.4注册到beanFactory的集合中
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// 4.2获取同时实现MergedBeanDefinitionPostProcessor的类,添加到新集合
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
//4.3注册到BeanFactory
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// Finally, re-register all internal BeanPostProcessors.
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// Re-register post-processor for detecting inner beans as ApplicationListeners,
// moving it to the end of the processor chain (for picking up proxies etc).
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
-
finishBeanFactoryInitialization
单例bean实例化和初始化
主要流程
-
初始化SpringApplication
- 添加启动类class到集合中
- 确定web类型
- 从spring.factories读取ApplicationContextInitializer和ApplicationListener,实例化加载到集合中
-
run方法
-
获取spring.factories里的SpringApplicationRunListener,并实例化(getRunListeners)
-
创建环境变量StandardServletEnvironment, 添加servletContextInitParams,servletConfigInitParams等配置到MutablePropertySources,value暂时为空(prepareEnvironment)
-
创建web上下文AnnotationConfigServletWebServerApplicationContext对象,调用无参构造方法,会同时实例化AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner(createApplicationContext)
-
AnnotatedBeanDefinitionReader的构造方法会将AutowiredAnnotationBeanPostProcessor(@AutoAware)以及ConfigurationClassPostProcessor等类注册到BeanFactory的beanDefinitionMap里(AnnotationConfigUtils.registerAnnotationConfigProcessors)
-
上下文前置工作,为上下文设置环境变量,调用ApplicationContextInitializer和SpringApplicationRunListener回调方法,设置applicationContext;将启动类加载到beanDefinition(prepareContext)
-
Refresh
- 设置开始时间, 调用StandardServletEnvironment的initPropertySources方法(prepareRefresh)
- 获取创建context时候创建的DefaultListableBeanFactory对象,为DefaultListableBeanFactory设置序列化id
- BeanFactory准备工作,设置classLoader, 添加忽略自动装配的接口列表,注册一些单例bean等(prepareBeanFactory)
-
备注:
ConfigurationClassPostProcessor作用
- 加载受spring管理的注解
- 包括以下:@Controller,@Service,@Dao,@Configuration等
- Import注解装饰的加载bean也会被导入
- 最终都会加载到DefaultListableBeanFactory中的beanDefinitionMap里,后期被bean初始化
- ConfigurationClassPostProcessor解析过程:spring 源码解析一(bean定义) - 梦天幻 - 博客园
- Spring源码:refresh方法解析_超级码农0912的博客-CSDN博客
BeanDefinition
-
GenericBeanDefinition:通用bean的解析,注册BeanDefinition的首选,实现如下
- ScannedGenericBeanDefinition和AnnotatedGenericBeanDefinition:存储@Component、@Service、@Controller等注解注释的类
-
AnnotatedBeanDefinition:存储基于注解的bean信息(接口)
-
ConfigurationClassBeanDefinition:存储@Configuration注解里的@Bean注解的bean信息
-
RootBeanDefinition:spring创建bean的时候,会把GenericBeanDefinition和ConfigurationClassBeanDefinition转为RootBeanDefinition
- GenericBeanDefinition的patentName属性指定了当前类的父类,RootBeanDefinition没有parentName属性,对应的getter函数只是返回null,setter函数不提供赋值操作(不提供继承关系)
- 子类会覆盖父类中相同的属性,所以Spring会首先初始化父类的RootBeanDefinition,然后根据子类的GenericBeanDefinition覆盖父类中相应的属性,最终获得子类的RootBeanDefinition