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

浙公网安备 33010602011771号