Spring核心方法总结
2023-02-10 21:44:49 0 举报
IoC MVC 核心流程示意图总结
作者其他创作
大纲/内容
ClassPathBeanDefinitionScanner 扫描器,去扫描指定路径下符合条件的 BeanDefinition 们,这个类就是处理 @Component 注解定义 Bean 的底层实现。@ComponentScan 注解的原理也是基于这个扫描器来实现的
AutowiredAnnotationBeanPostProcessor
registerDependentBean依赖的关系进行缓存
SpringApplication#applyInitializers
CommonAnnotationBeanPostProcessor
完整的Bean
N
FactoryBean 类型 Bean 的名称(& 开头)
XML 配置文件
创建BeanFactory
font color=\"#000000\
@SpringBootApplication
doGetBean
ClassPathBeanDefinitionScanner
根据@EnableAutoConfiguration中的exclude、excludeName移除不需要的配置类
org.springframework.boot.SpringApplication#prepareContext(this.applyInitializers(context);)
ServiceMesh
Environment
创建BeanFactory 后会调用所有的 BeanFactoryPostProcessor 处理器对其进行后置处理。@Bean 注解就是在这个过程被解析的,解析过程大致就是遍历所有的 BeanDefinition,如果其内部包含 @Bean 标注的注解,则会将该方法解析出一个 BeanDefinition 对象并注册。当然,除了 @Bean 注解外,例如 @ComponentScan、@Import、@ImportResource、@PropertySource 注解都是在该过程中进行解析的
获取到 Bean
@Autowired 等注解
循环判断
循环执行实现接口ApplicationContextInitializer的类的initializer
Bean属性注入
getBean(dep)创建依赖对象
4
@EnableAutoConfiguration注解最重要的是AutoConfigurationImportSelector.class,将需要装配的类装配到IoC容器
PropertySource列表
@AutoConfigurationPackage
MQ
createBean
n
registerAnnotationConfigProcessors方法
报异常
解析出一个 BeanDefinition 对象
概括:可以看到这个方法加载 Bean 的过程中,会先从缓存中获取单例模式的 Bean;不管是从缓存中获取的还是新创建的,都会进行处理,如果是 FactoryBean 类型则调用其 getObject() 获取目标对象;BeanFactory 可能有父容器,如果当前容器找不到 BeanDefinition 则会尝试让父容器创建;创建 Bean 的任务交由 AbstractAutowireCapableBeanFactory 去完成;如果获取到的 Bean 不是我们想要类型,会通过类型转换机制转换成目标类型
BeanDefinition
Redis
这里可以自定义Scope,拓展spring的Bean作用域
主要是读取META-INF/spring.factories文件,经过去重、过滤,返回需要装配的配置类集合(会使用到条件注解和过滤属性)ConditionEvaluator#shouldSkip 对条件注解起作用
解析 @Autowired 和 @Value 注解标注的属性,获取对应属性值
获取@EnableAutoConfiguration中的exclude、excludeName等
AutoConfigurationImportSelector
@Bean等配置类注解
执行所有实现PropertySourceLocator接口的类方法
getMergedLocalBeanDefinition容器中获取BD
containsBeanDefinition(beanName)容器中是否存在
scan(String... basePackages)
Bean 是根据 BeanDefinition 配置元信息对象生成的。我们在 Spring 中通常以这两种方式定义一个 Bean:面向资源(XML、Properties)、面向注解
mbd.isSingleton()单例模式
SpringBoot启动类
MyBatis
MySQL
早期的Bean
实例化
getObjectForBeanInstance
@Import({AutoConfigurationPackages.Registrar.class})
配置类解析 入口在 ConfigurationClassPostProcessor 这个处理器中
ConfigurationClassPostProcessor.processConfigBeanDefinitionsConfigurationClassParserAutoConfigurationGroup先执行process后执行selectImports
通过 InstantiationAwareBeanPostProcessor 对该属性值进行处理,最后通过反射机制将属性值设置到这个 Bean 中。
beforePrototypeCreation标记为原型模式正在创建
y
@Import({AutoConfigurationImportSelector.class})
isDependent循环依赖判断
3
@EnableAutoConfiguration
2
通过loadFactoryNames方法,扫描classpath下的META-INF/spring.factories文件,里面是以key=value形式存储,读取其中key=EnableAutoConfiguration,value就是需要装配的配置类,也就是getCandidateConfigurations返回的值
通过@AutoConfigurationPackage注解将添加该注解的类所在的package作为自动配置package进行管理
成功创建则进行缓存,并移除缓存的早期对象
AbstractBeanFactory
K8S
早期的Bean
Spring
Linux
selectImport方法
parentBeanFactory AbstractBeanFactory类型
初始化
getAutoConfigurationEntry方法
getAttributes方法
implements ApplicationContextInitializer这个PropertySourceBootstrapConfiguration 也是initializer
BeanDefinitionRegistry 注册中心注册
AbstractApplicationContext#refresh
getParentBeanFactory()存在父容器,则从父容器找
Y
获取所有自动装配的配置类,也就是读取spring.factories文件(SPI)
SpringBoot
isPrototypeCurrentlyInCreation判断存在循环依赖
loadBeanDefinitions(Resource resource) 方法,解析 Resource 资源的入口XmlBeanDefinitionReader 加载该 XML 文件,获取该 Resource 资源
加载
Nacos配置服务执行机制
包含 @Bean 标注的注解
解析
DefaultBeanDefinitionDocumentReader解析 DOM document 中的 BeanDefinition
是否需要进行类型转换
@SpringBootConfiguration
自动装配的核心实现
通过@EnableAutoConfiguration注解实现自动装配
会解析 @Resource 注解标注的属性,获取对应的属性值
去除重复的配置项
遍历所有的 BeanDefinition
getExclusions方法
mbd.isPrototype()原型模式
Bean代理对象
removeDuplicates方法
并发编程
标识SpringBootApplication是一个SpringBoot配置类
BeanDefinitionReader
AnnotationConfigUtils
代理
总结:1)通过注解@SpringBootApplication=>@EnableAutoConfiguration=>@Import({AutoConfigurationImportSelector.class})实现自动装配2)AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类3)通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类4)依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配
getSingleton(beanName)
创建 Bean 都是使用AbstractAutowireCapableBeanFactory的createBean方法
transformedBeanName
session等其他模式
sharedInstance存在
最后根据多次过滤、判重返回配置类合集
mbd.getDependsOn()依赖对象集合
afterPrototypeCreation标记为不在创建
@Component(及其派生注解)
JVM
调用所有的 BeanFactoryPostProcessor 处理器
非 FactoryBean 类型直接返回,,否则,调用 FactoryBean#getObject() 获取目标对象
PropertySourceLocator.locate方法
JenkinsDevOps
getCandidateConfigurations方法
SpringCloud
不为抽象类型
mbd.getScope()获取容器中可用span style=\
@ComponentScan、@Import、@ImportResource、@PropertySource 注解@Bean
完整Bean
alreadyCreated标记为已创建
1
广播事件
ConfigurationClassPostProcessor
算法与数据结构
不同模式创建方式
循环依赖检查中会使用到
fireAutoConfigurationImportEvents方法
刷选其他注解...
getBean
收藏
收藏
0 条评论
下一页