Spring源码分析笔记--AOP

核心类&方法 BeanDefinition

Spring源码分析笔记--AOP

Spring源码分析笔记--AOP

Bean的定义信息,封装bean的基本信息,从中可以获取类名、是否是单例、是否被注入到其他bean中、是否懒加载、bean依赖的bean的名称等。

Aware

Spring源码分析笔记--AOP

继承Aware的bean可以感知到他在容器中的一些属性,如获取bean在容器中的ID,甚至获取到容器等。

BeanPostProcessor

Spring源码分析笔记--AOP

 

Bean的后置处理器,可在bean的创建、初始化等阶段的前后对bean进行增强处理等。

BeanFactory

Spring源码分析笔记--AOP

Spring源码分析笔记--AOP

Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactoryIOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

是访问容器的顶层接口,他的实现类中会有一个MAP,用于存储beanBeanDefinition

(FactoryBean区别:实现FactoryBean接口也是在容器中注入bean的方式之一,但它不是一个普通的bean,而是生成指定bean的一个工厂)

 

AbstractAutowireCapableBeanFactory:: populateBean..

DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory

此方法用于给bean注入依赖的其他bean

 

BeanWrapper

将交于容器管理的bean装饰,屏蔽多样性,统一的setget方法,方便统一操作

 

核心流程源码 AnnotationAwareAspectJAutoProxyCreator创建过程

AOP核心类:AnnotationAwareAspectJAutoProxyCreator,本质是一种BeanPostProcessor

 

容器启动时:

==》 org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.Class<?>...)   register(annotatedClasses);//加载、注册配置类;配置类也是一个被容器管理的bean   refresh();//刷新容器,注册、创建相关bean ==》 org.springframework.context.support.AbstractApplicationContext#refresh  // Register bean processors that intercept bean creation.   registerBeanPostProcessors(beanFactory);//注册容器需要的核心BeanPostProcessor   // Instantiate all remaining (non-lazy-init) singletons.   finishBeanFactoryInitialization(beanFactory);//创建并初始化其他非懒加载的bean,主要是业务类bean ==》 org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors ==》 org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, org.springframework.context.support.AbstractApplicationContext)   // Separate between BeanPostProcessors that implement PriorityOrdered, Ordered, and the rest.   //根据继承的order等级,顺序创建BeanPostProcessor   //AnnotationAwareAspectJAutoProxyCreator实现了Order   //创建   BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);   //添加到容器-FactoryBean中   org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List<org.springframework.beans.factory.config.BeanPostProcessor>) ==》 org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String, java.lang.Class<T>) ==》 org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean//BeanPostProcessor和业务Bean都用此创建bean   //创建bean   return createBean(beanName, mbd, args); ==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])   // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.   //有一次通过代理直接返回对象的机会,但一般都不会走到此方法中   Object bean = resolveBeforeInstantiation(beanName, mbdToUse);   //创建过程   Object beanInstance = doCreateBean(beanName, mbdToUse, args); ==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean   //创建Bean,通过Wrapper装饰   if (instanceWrapper == null) {     instanceWrapper = createBeanInstance(beanName, mbd, args);   }   // Initialize the bean instance.   //填充bean后初始化bean   Object exposedObject = bean;   try {   populateBean(beanName, mbd, instanceWrapper);   if (exposedObject != null) {   exposedObject = initializeBean(beanName, exposedObject, mbd);   }   } ==》 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)   //初始化bean   //检查实现了哪些aware,并注入相应的值   invokeAwareMethods(beanName, bean);   //BeanPostProcessor初始化前置处理   wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);   //调用bean的初始方法   invokeInitMethods(beanName, wrappedBean, mbd);   //BeanPostProcessor初始化后置处理   wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); ==》 org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#postProcessAfterInitialization   //此类做Bean初始化的后置处理,若bean有advice则创建proxy bean,此bean无。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpgzpg.html