spring-boot读源码前的疑问解析

1.如何载入启动类的@SpringBootApplication注解?

org.springframework.boot.BeanDefinitionLoader#load(java.lang.Class<?>)

org.springframework.boot.BeanDefinitionLoader#isComponent

org.springframework.context.annotation.AnnotatedBeanDefinitionReader#register

最后将@SpringBootApplication注解存于org.springframework.core.type.StandardAnnotationMetadata#annotations中

 

2.注册的bean存在哪的对象中?

bean定义存于org.springframework.beans.factory.support.DefaultListableBeanFactory#beanDefinitionMap

private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>(256);

 

单例bean存于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonObjects

实际是DefaultSingletonBeanRegistry的子类DefaultListableBeanFactory

 

3.默认单例的代码是哪里实现的?

org.springframework.context.annotation.AnnotationScopeMetadataResolver#resolveScopeMetadata

// 查找sope注解,未找到时返回默认ScopeMetadata

 

public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) {

ScopeMetadata metadata = new ScopeMetadata();

if (definition instanceof AnnotatedBeanDefinition) {

AnnotatedBeanDefinition annDef = (AnnotatedBeanDefinition) definition;

AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(

annDef.getMetadata(), this.scopeAnnotationType);

if (attributes != null) {

metadata.setScopeName(attributes.getString("value"));

ScopedProxyMode proxyMode = attributes.getEnum("proxyMode");

if (proxyMode == null || proxyMode == ScopedProxyMode.DEFAULT) {

proxyMode = this.defaultProxyMode;

}

metadata.setScopedProxyMode(proxyMode);

}

}

return metadata;

}

 

 

public class ScopeMetadata {

// 默认单例

private String scopeName = BeanDefinition.SCOPE_SINGLETON

}

4.SpringCloud程序执行两次SpringApplication#run(java.lang.String...)

BootstrapApplicationListener 监听到事件ApplicationEnvironmentPreparedEvent时,会重新设置上下文

org.springframework.cloud.bootstrap.BootstrapApplicationListener#bootstrapServiceContext

通过

 

5.IOC容器提供的扩展点有哪些

a.bean工厂扩展

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

扩展接口:BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor

interface BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor

主要排序、排序、无顺序要求的BeanFactoryPostProcessor三类

典型实现类:ConfigurationClassPostProcessor

invokeBeanFactoryPostProcessors主要做的就是执行BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor的2个扩展方法。这些BeanFactoryPostProcessors可能是内部Spring实现添加好的,也可能是来自ClassPath扫描出来的BeanFactoryPostProcessors

 

 

PostProcessorRegistrationDelegate.registerBeanPostProcessors

扩展接口:BeanPostProcessor

interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor

interface MergedBeanDefinitionPostProcessor extends BeanPostProcessor

interface DestructionAwareBeanPostProcessor extends BeanPostProcessor

 

6.使用了哪些设计模式?

模板、工厂、桥接、代理、观察者、装饰器等等等等

 

7.如何处理@Configuration

ConfigurationClassPostProcessor 载入@Configuration

ImportAwareBeanPostProcessor 处理@Import

 

posted @ 2022-08-12 18:27  windge  阅读(42)  评论(0)    收藏  举报