springIOC
2023-06-07 00:57:19 2 举报
spring中的一些事......
作者其他创作
大纲/内容
Spring: IOC AOP
for (BeanPostProcessor processor : getBeanPostProcessors()) {{//font color=\"#e0142c\
pointCut
invokeBeanFactoryPostProcessors方法里分为两大步1.所有BeanDefinitionRegistryPostProcessor调用完毕--End2.处理BeanFactoryPostProcessor --Begin
工厂方法@Bean是工厂方法
BeanPostProcessor
调用
再次调用
beanPostprocessor.postProcessBeforeInstantiation
接口实现
jdk根据接口生成1个$Porxy.class文件;实现接口通过反射调用具体方法
获取当前线程暴露的代理类
getAdvicesAndAdvisorsForBean
AOP切面解析
AnnotationAwareAspectJAutoProxyCreator
@Lazy,@Scope颜色,款式
初始化之后会调用很多的Aware(感知)方法和@PostConstructInitializingBeaninitMethod
融合事务外层事务存在,嵌套事务和外层事务共用一个连接
类xml@注解
ClassPathXmlApplicationContext
循环拿到
调用canApply
BeanDefinitionRegistryPostProcessor注册BeanDefinitionRegistryPostProcessor是bean定义解析前调用
AnnotationApplicationContext
配置类Springconfiguration
BeanDefinitionRegistryPostProcessorPriorityOrdered(接口)
1 postProcessBeanDefinitionRegistry
invokeBeanFactoryPostProcessors(beanFactory)(此方法会调用所有实现了bean工厂后置处理器的bean定义)
1.this
spring源码脑图
粗筛
findCandidateAdvisors
在第一个bean的后置处理器
BeanFactoryPostProcessorPriorityOrdered
postProcessBeanFactory
1.通过无参构造函数(默认)ClassName=bean定义.beanclassClass clazz=Calss.forName(ClassName)clazz.newInstance()2.通过有参构造函数ClassName=bean定义.beanclassClass clazz=Calss.forName(ClassName)//自动装配 constructor..... xml配置Constructor con= c.getConstructor(arg...);Object obj = con.newInstance(arg....);
设计师BeanDefinitionRegistry
木板@Bean
ConfigurationClassPostProcessor解析@ComponentScan@Component@Bean@Import@Service.....
执行方法
设置proxyTargetClass = true采用CGLIB动态代理如果没设置并且有接口就会使用JDK动态代理
parse()
springIOC在加载过程中允许配置两个相同Bean名称,但是后者会覆盖前者
postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)传入注册器:就可以主策一个beanregistry.registerBeanDefinition(\"car\
class BeanB(){@AutoWiredBeanB A;}
完成了spring内部BeanDefinition的注册(主要是后置处理器)创世纪类
处理嵌套事务逻辑
bean的后置处理器
实例化我们剩余的单实例bean.finishBeanFactoryInitialization(beanFactory)
调用分为两大步
BeanDefinitionRegistryPostProcessorOrdered(接口)
2 postProcessBeanDefinitionRegistry
CGLIBEnhancer指定实现类底层采用ASM框架生成.calss文件,生成多个:采用继承本类调用其他方法会重复增强
BeanDefinitionBean定义
1.配置类 ,xml @注解 javaConfig2.加载Spring上下文 xml :new ClassPathXmlApplicationContext(“xml”) 注解: new AnnotationApplicationContext(config.class)3getBean4.一个类生产成一个bean最重要的类BeanFactory:bean工厂
实例化创世纪的类beanFactory.font color=\"#e74f4c\
BeanDefinitionRegistryPostProcessor调用4带注册功能的后置处理
select()
pointcut@AspectJ表达式
接待扫描BeanDefinitionScanner@Component
采用责任链模式调用(递归,执行完所有通知)
扩展
bean
结果
font color=\"#f21313\
完整类名数组
ImportSelector:注册到容器是权限定类名
修改
衣柜店XmlApplicationContext
注册到
ConfigurationClassPostProcessor 给配置类创建cglib动态代理(不创建动态代理每次都会创建新对象)
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner真正扫描配置配置类的的scanner扫描配置类
循环依赖
BeanFactory
Proxy.newIntance
getBean()判断是否符合生产标准判断是否是FactoryBean->&bean ->getObject();(Ioc加载完调用getBean())符合标准->getBean首先从一级缓存中拿,有就直接返回没有就调用creatBean()
invokeBeanFactoryPostProcessors(beanFactory)(此方法会调用所有实现了bean工厂后置处理器的bean定义)ConfigurationClassPostProcessor(这个方法实现了bean工厂的后置处理器,所以在此会被调用)(执行此方法会解析配置类)
this.beanFactory = new DefaultListableBeanFactory();有注册Bean定义的能力DefaultListableBeanFactory 实现(BeanDefinitionRegistry,BeanFactory)
BeanFactory :是spring的顶层接口,使用了简单工厂模式;简单工厂的实质,由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(根据不同的名字,生产bean);负责生产Bean
实例化
@ComponentScan为例讲解
BeanFactoryPostProcessorbean工厂的后置处理器BeanFactoryPostProcessor是bean定义解析后调用
具体方法,就不会代理
进行正在的解析判断是不是完全的配置类 还是一个非正式的配置类font color=\"#e74f4c\
属性赋值时产生的问题
$Proxy.class接口
ImportBeanDefinitionRegistrar:注册到容器是短类名
注册
调用构造函数 this(); 注册我们的配置类 register(annotatedClasses); IOC容器刷新接口 refresh();
Advice增强代码,处理事务PointCut匹配bean是否符合创建动态代理规则(类或方法上是否有@Transactional注解)
BeanDefinitionReader:读取器:读取到所有的beanBeanDefinitionScanner:扫描器:通过扫描读取到的bean,判断哪些bean需要注册
getBean(\"user\")
registerBeanDefinition
refresh中的方法
MethodInterceptor.intercept
BeanDefinitionMap
parser.parse(candidates);
使用三级缓存:三个map多线程情况下使用锁
BeanDefinitionRegistryPostProcessor
3 postProcessBeanDefinitionRegistry
ProxyTransactionManagementConfiguration配置类
调用顺序0MethodInvocation oldInvocation = invocation.get();;1.异常-》2.返回-》3.后置-》4.前置-》5.目标方法
MyBeanFactoryPostProcessor
refresh
IOC容器刷新接口
doScan
实现
属性赋值
new
BeanFactoryTransactionAttributeSourceAdvisor拿到之前的Advisor
BeanDefinitionRegistryPostProcessor:span style=\
此处才把@Bean的方法和@Import 注册到BeanDefinitionMap中this.reader.loadBeanDefinitions(configClasses);
postProcessBeanDefinitionRegistry
BeanDefinitionReader:读取配置类
AOP会覆盖事务bean的后置处理器
A依赖B
拿到
BeanDefinitionRegistry:负责注册BeanDefinition
链接
creatProxy创建动态代理
JdkDynamicAopProxy-》invoke()
调用执行 retVal = invocation.proceed();
2-3.this
买房子,b style=\
map.get()
creatBean解析
Spring中文文档
直接调用实现了被代理的子类(动态代理类)
AnnotationTransactionAttributeSource根据当前bean的所有方法@Transactional方法-接口-父类-
第一次调用
class BeanA(){@AutoWiredspan style=\
BeanDefinitionRegistryPostProcessor和BeanDefinitionRegistry的联系postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
开启事务
解析Advisor
shouldSkip找到候选的Advisors(通知 前置通知、后置通知等..)等span style=\
shouldSkip
font color=\"#e0142c\
该步骤是我们真正的创建我们的bean的实例对象的过程font color=\"#1212e8\
jdk
调用bean的后置处理
IOC Container
AutoProxyRegistrar@Import-ImportBeanDefinitionRegistrar
font color=\"#db0909\
创建懂动态代理(类似于aop)初始化方法之后的bean的后置处理器
初始化initMethoddestroy
实例化
enhancer.creat()
声明式事务基于AOP
getBean时会调用
DefaultSingletonBeanRegistry(Map所在的类) 一级缓存 这个就是我们大名鼎鼎的单例缓存池 用于保存我们所有的单实例bean font color=\"#db0909\
BeanFactoryPostProcessor
ConfigurationClassPostProcessor实现PriorityOrdered 解析了配置类的时候MyBeanFactoryPostProcessorfont color=\"#1212e8\
getBean(既可以生产bean,也可以获取bean)
走完此方法会调用创建bean的方法实例化我们剩余的单实例bean.finishBeanFactoryInitialization(beanFactory)
BeanDefinitionReaderUtils.registerBeanDefinitionfont color=\"#f21313\
拿到之前解析的事务属性createTransactionIfNecessary(有必要的话创建事务)获取一个事务状态font color=\"#f01111\
internalConfigurationAnnotationProcessorConfigurationClassPostProcessor.......解析我们配置类.......
reader:注册
doCreatBean创建
销售BeanDefinitionReader楼盘配置类xml
反射
橱柜店@ApplicationContext
ConfigurationClassPostProcessor......
findAdvisorBeans()
开始
matches
creatBean
图纸BeanDefinition
创建每一个bean的时候调用初始化后的bean的后置处理器,拿到所有的Advisors循环跟当前得bean做配对如果配对上了说明当前得bean需要创建动态代理
精筛
bean的后置处理器:(扩展点)BeanPostProcessor总共调用9次
this.reader.register(annotatedClasses);注册配置类
register注册配置类
B依赖A
@EnableTransactionManagement开启事务
多个CGLIB.class继承
InvocationHander.invoke
10010
AopContext.currentProxy()
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;{// 获得bean定义i RootBeanDefinition car = (RootBeanDefinition) beanFactory.getBeanDefinition(\"car\");}
processedBeans 以处理过的集合
postProcessBeforeInstantiation
BeanFactoryPostProcessorBeanDefinitionRegistryPostProcessor
真正的解析我们的bean定义processConfigBeanDefinitions(registry);
@AspectJ@Before@After.......
初始化
ASM编写.class框架
实例化:createBeanInstance反射
1.所有BeanDefinitionRegistryPostProcessor调用完毕--End2.处理BeanFactoryPostProcessor --Begin
InfrastructureAdvisorAutoProxyCreator(覆盖)AnnotationAwareAspectJAutoProxyCreator处理事务的beanPostProcessor
挂起事务逻辑:把外层事务的属性转移到事务暂停同步管理器中,再把外层事务ConnectionHolder置为空,然后嵌套事务开启新的事务,事务属性指向原来的ConnectionHolder,直到内层事务提交或者回滚之后,再把暂停事务同步管理器的属性移到原来的ConnectionHolder上,继续执行事务
CGLIB
TransactionManagementConfigurationSelector@Import->ImportSelector
BeanDefinitionMapfont color=\"#4669ea\
工厂方法可以自己控制Bean的实例
ConfigurationClassParser parser = new ConfigurationClassParser创建一个配置类解析器对象
实现了
BeanFactoryPostProcessorOrdered
填充属性@AutoWrited@Value
根据传播行为
font color=\"#f01111\
BeanFactoryTransactionAttributeSourceAdvisor-AdvisortransactionInterceptor-AdviceAnnotationTransactionAttributeSource-用于解析注解@Transactional
再次调用回代理类
this.advisorFactory.getAdvisors解析切面
工厂BeanFactory
doCreateBean
Bean的生命周期
拿到所有之前解析的Advisorsfont color=\"#323232\
实例化我们剩余的单实例bean. finishBeanFactoryInitialization(beanFactory);
BeanDefinition :是spring的顶层接口,封装了生产bean的一切原料:相当于一个Map容器
AOP创建动态代理
事件applicationContext
反射由spring控制,无法干预
IOC:控制反转:用来解决层层之间的耦合
BeanDefinitionScanner:不扫描配置类
使用@Bean注解
你@Componentclass
BeanFactoryPostProcessor不带注册的
粗筛canApply
matches返回true
开始创建Spring上下文
BeanDefinitionRegistryPostProcessorBeanFactoryPostProcessor
4 postProcessBeanFactory
BeanFactoryPostProcessorbean工厂的后置处理器修改BeanDefinitionRegistryPostProcessor注册PriorityOrderd排序优先执行
此方法循环所有的Bean定义,注册成真正的Bean,IOC容器bean
0 条评论
回复 删除
下一页