Spring核心原理(IOC/AOP)
2022-06-21 13:30:18 34 举报
Spring的核心原理包括IOC(控制反转)和AOP(面向切面编程)。IOC是一种设计思想,通过将对象的创建、配置和管理交给容器来完成,从而实现解耦。AOP则是一种编程范式,通过在程序运行时动态地将代码切入到指定的方法或对象中,从而实现横切关注点的模块化。Spring框架通过这两个核心原理,实现了高度模块化、可扩展性和易于维护的应用程序开发。
作者其他创作
大纲/内容
关于三级缓存有如下结论:二级缓存的作用是知道哪些bean在半成品(还没有填充属性)的时候被其他bean所引用(依赖),此时这个半成品的引用可能会在其初始化的时候改变,从而使得引用这个半成品bean的bean引用到错误的bean,导致容器启动失败,抛出异常BeanCurrentlyInCreationException,所以说没有二级缓存的存在是无法知道这个bean还是半成品的时候已经被其他的bean所引用。
检查别名是否存在循环
AnnotatedBeanDefinitionReader
初始化
注册别名在aliasMap中
FactoryBeanRegistrySupport
10. 所有单例Bean初始化后回调接口SmartInitializingSingleton#afterSingletonsInstantiated
BeanDefinitionRegistry
ListableBeanFactory
一级缓存
DefaultListBeanFactory
containedBeanMap
6. Bean实例化
支持不同信息源(国际化)
SpringMVC
AliasRegistry
AbstractBeanFactory
SingletonBeanRegistry
将解析的BeanDefinetion交给DefaultListBeanFactory
如果bean在初始化时引用被修改,并且存在其他bean依赖他,将会抛出异常
转换成Document对象
bean缓存
IntroductionAdvisor
初始化后
ResourceLoader
BeanFactory
singletonFactories
顾问
singletonObjects
分层
BeanDefinitionRegistry唯一一个真正的实现类DefaultListableBeanFactory,容器中很多类也对BeanDefinitionRegistry进行了实现,但是最终都是转给了DefaultListableBeanFactory来完成
属性填充
属性赋值前
afterSingletonCreation(beanName)
不提前暴露
AutowireCapableBeanFactory
Advisor
InstantiationAwareBeanPostProcessor#postProcessProperties
getDependentBeans
MethodMatcher
依赖缓存
具体解析过程交给BeanDefinitionParserDelegate完成
一个定义比较完整的容器接口,还增加了一些高级特性
ClassFilter
初始化(调用BeanPostProcessor)
载入
IOC的继承体系
HierarchicalBeanFactory
转换过程:1. 将FactoryBean前面的&去掉2. 如果是别名通过别名获取beanName
BeanDefinitionReader
MethodInterceptor
定义Bean的方式以上3种,xml和注解最终都会被解析然后通过api的方式变成BeanDefinition
XmlBeanDefinitionReader
dependentBeanMap
AbstractBeanFactory#getMergedBeanDefinition
三级缓存 : 存放正在创建的beanbeanName->objectFacotry
AfterReturningAdvice
11,12. 使用和销毁
这些Reader主要用于读取我们定义的Bean然后转换成BeanDefinition
Advice
实例化后
bean依赖相关实现
DefaultSingletonBeanRegistry
String beanName = this.transformedBeanName(name);
ApplicationContext
将解析的数据放入BeanDefinetion中
3. Bean注册
实现此接口来调整BeanDefinition内部内容
三级缓存
找到文件xml文件所在位置,创建出对应的Resource对象,便于之后IO操作获取XML对象
doCreateBean
9. 初始化
一级缓存 : 存放的是已经创建好的beanbeanName->beanObj
BeanDefinition是对容器种Bean信息的一种描述,他包含如果lazyInit,name等等Bean的信息,也可以在容器启动过程中动态修改这些信息值
获取依赖bean
Bean的生命周期
Spring是个容器,我们需要个他一个Bean的清单,然后他根据这个单子来生成实例span style=\"font-size: inherit;\
Bean定义阶段,我们如果使用的是xml或者注解的方式来定义的话我们需要对这些定义进行解析,也就是Bean的解析阶段,解析阶段主要用到一些解析器
容器分层
InitializingBean#afterPropertiesSet
bean的依赖mapbeanName->Set<beanName>
spring循环依赖
返回
AbstractBeanDefinition# private volatile Object beanClass将上面字段转换成Class对象,用于后面我们给对象进行实例化。注意此字段的值可以有两种类型,一个是字符串类型的类的全限定类名,还一种可能是就是Class对象,当时的一种类型的时候我们在此阶段就需要将其转换成Class对象转换代码逻辑:org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass
DefaultListBeanFactory完成注册(放入Map中)
xml
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition
这里涉及到三级缓冲:1. 一级缓存:可以直接使用的对象2.二级缓存:未初始化完全的对象3.三级缓存:存放工厂bean
定义方式
bean创建前后
BeanDefinition
存在该bean
注意:1. 此阶段仅仅是解析了定义信息成了BeanDefinition对像,但是有些定义的如EL表达式等都没有被替换成具体的实际值
beforeSingletonCreation(beanName)
从缓存中获取单例 对象
new()
dependenciesForBeanMap
AOP
表示可以获取Environment
创建xml文件读取器
细化了工厂中的方法
SingletonBeanRegistry
IOC初始化
1. Bean定义
创建出dom树
细化了工厂方法,增加了更多的方式获取Bean的names,主要还是关注定义对容器的 查相关
想要了解什么是bean合并,我么首先要知道我们在定义bean时是可以设置一个属性parent的,这个属性的意思当前我们定义的bean的属性如果和我们指定的parent的bean有相同的部分,我们又没有设置,这个时候我们直接取父类的(这个父类不是继承)而合并就是指将我么你指定的parent中的bean的属性放到我们的当前bean中,最终会生成RootBeanDefinition
singletonsCurrentlyInCreation
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
正在创建的beanNames集合
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation
支持事件
createBean
二级缓存 : 存放正在创建的bean但是被其他bean依赖beanName->beanObj
ApplicationEventPublisher
已经创建好的beanNames集合
主要定义了一些对BeanFactory的配置功能
EnvironmentCapable
Object sharedInstance = this.getSingleton(beanName);
api
ConfigurableListableBeanFactory
Spring RMI
从一二三级缓存中获取bean
注册
这个过程比较简单了,循环处理PropertyValues中的属性值信息,通过反射调用set方法将属性的值设置到bean实例中。PropertyValues中的值是通过bean xml中property元素配置的,或者调用MutablePropertyValues中add方法设置的值。
<beans> <bean id=\"lesson1\" class=\"com.lue.spring01.bean.LessonModel\"/> <bean id=\"lesson2\" parent=\"lesson1\"> <property name=\"name\" value=\"XXX\"> <property name=\"lessonCount\" value=\"100\"/> </bean> <bean id=\"lesson3\" parent=\"lesson2\"> <property name=\"description\" value=\"HAL10\"/> </bean></beans>
注解
ConfigurableBeanFactory
bean的各种配置细节
合并过程
BeanPostProcessor的postProcessBeforeInitialization
顶级接口定义getBean
spring包含模块
bean注册
事务处理
SimpleAliasRegistry
实现工厂分层,给工厂提供了双亲功能(getParentBeanFactory()的接口功能)
8. 属性赋值
选择后续实例化时构造器
disposableBeans
BeanPostProcessor#postProcessAfterInitialization
WebAppApplicationContext
将beanName从当前创建列表中移除
循环依赖解决:提前曝光未填充的bean对象,放入二级缓存
实例化前自定义操作
对容器中的实例生命周期进行管理规范
Resource定位
通过spring规则解析dom树
二级缓存
doGetBean
MessageSource
singletonFactory.getObject()
getSingleton
前面我们通过BeanDefinitionReader解析成BeanDefinition对象后,此时我们需要注册到工厂中去,方便后面进一步操作
PointCut
定义单例bean如果向容器注册bean
包含了基本IoC容器所具有的重要功能
earlySingletonObjects
对bean生命周期管理定义
注册器
postProcessMergedBeanDefinition有2个实现类1. org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor在 postProcessMergedBeanDefinition 方法中对 @Autowired、@Value 标注的方法、字段进行缓存2. org.springframework.context.annotation.CommonAnnotationBeanPostProcessor在 postProcessMergedBeanDefinition 方法中对 @Resource 标注的字段、@Resource 标注的方法、 @PostConstruct 标注的字段、 @PreDestroy标注的方法进行缓存
获取指定beanName的别名,遍历map,并且判断别名是否还有别(别名的别名)
注册单例bean(简单的丢到一级缓存移除二三级缓存)
Invocation
将name转换成beanName
2. Bean解析
DefaultListableBeanFactory
4. bean合并
应用
配置了销毁方法的bean缓存
Joinpoint
通过不同的IO获取Bean定义
5. class类加载
ThrowsAdvice
切入点
7. 合并后处理
1. 该接口主要对BeanDefinition的一个增删查改的一个规范2. 并且继承了AliasRegistry
Spring JDBC
例子
MethodInvocation
PropertiesBeanDefinitionReader
AbstractAutowireCapableBeanFactory
连接点
初始化前
IOC
别名注册
BeanDefinitionBuilder
registeredSingletons
ConfigurableApplicationContext
ConfigurableListBeanFactory
将beanName加入当前创建列表中
XmlBeanFactory
通知
构建
提前暴露
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors
一级缓存 :存放完全创建好了的bean三级缓存:存放实例化的但是没有填充属性的bean二级缓存:存放从3级缓存移动2级缓存的bean,如下说明getSingleton(\"beanName\
不存在该bean
inCreationCheckExclusions
读取定位的Resource
创建列表
bean销毁相关实现
构建工具
MethodBeforeAdvice
丢入3级缓存
创建bean
0 条评论
回复 删除
下一页