spring ioc主流程
2020-01-11 11:16:35 92 举报
spring ioc源码分析
作者其他创作
大纲/内容
BeanFactoryPostProcessor.postProcessBeanFactory()
doLoadBeanDefinitions
parseDefaultElement处理默认标签,如bean\\import等
AbstractBeanDefinitionParserparse()方法中parseInternal(),通过自定义的parser解析标签并返回BeanDefinition
4、配置文件读取,读取后如何替换占位符${}<context:propertityPlaceHolder>
ContextNamespaceHandlerinit()方法注册了component-scan的处理器ComponentScanBeanDefinitionParser
registerBeanPostProcessors添加internalAutowiredAnnotationProcessorinternalCommonAnnotationProcessor到beanFactory的BeanPostProcessor
AutowiredAnnotationBeanPostProcessor.findAutowiringMetadata()查找注解元素->buildAutowiringMetadata(clazz)->ReflectionUtils.doWithLocalFields()
9、mybatis定义MapperScannerConfigurer,为何不能注入sqlSessionFactory beanMapperScannerConfigurer bean的BeanDefinition是在ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();生成但容器后置处理器PropertyPlaceHolderBeanFactoryProcessor是在该方法执行之后的invokeBeanFactoryPostProcessors(beanFactory);执行,如果使用sqlSessionFactory bean注入,sqlSessionFactory BeanDefinition 占位符${}等还会被修改,导致数据库连接信息错误,造成无法连接数据库(通过<property name=\"sqlSessionFactory\" ref=\"sqlSessionFactory\"/>,这样做可能会有一个问题,就是在初始化MyBatis时,jdbc.properties文件还没被加载进来,dataSource的属性值没有被替换,就开始构造sqlSessionFactory类,属性值就会加载失败。MapperScannerConfigure提供了String类型的sqlSessionFactoryBeanName,通过<property name=\"sqlSessionFactoryBeanName\" value=\"sqlSessionFactory\" />,这样先将bean name注入到sqlSessionFactoryBeanName,等到spring初始化完成后,再通过bean name构建sqlSessionFactory。)
matchSelf
加载BeanDefition,注册到BeanDefitionRegistry
AbstractBeanDefinitionParserparse()方法中registerBeanDefinition
DefaultListableBeanFactory:实现了接口:BeanDefinitionRegistry、BeanFactory
ClassPathScanningCandidateComponentProvider.scanCandidateComponents()扫描该包下的所有class根据是否有包含@component @service @controller等注解进行判断是否加载BeanDefinition
BeanDefinitionVisitorvisitor.visitBeanDefinition->visitPropertyValues()->resolveValue()->resolveStringValue()->this.valueResolver.resolveStringValue
AbstractApplicationContext refresh()方法中的obtainFreshBeanFactory()方法
metadata.hasAnnotation(this.annotationType.getName()) || this.considerMetaAnnotations && metadata.hasMetaAnnotation(this.annotationType.getName())AnnotationTypeMappings mappings = this.mappings[i];这里的mappings,如果是@service或者@controller注解,由于包含下方注解,所以这个mapping中会含有Component的内容,因此可以作为bean被扫描到,并加载BeanDefinition,并注册到BeanDefinitionRegistry@Component
根据14个handlerMapping找到对应的NamespaceHandler
6、AutowiredAnnotationBeanPostProcessor实现了什么@Autowired注解如何注入属性值给bean
5、注解如何扫描,扫描后做什么处理
解析配置文件
AbstractApplicationContextrefresh()中invokeBeanFactoryPostProcessors()注册并初始化容器后处理器PropertyPlaceHolderBeanFactoryPostProcessor就包含于此
读取web.xmlContextLoaderListenercontextInitialized()
doCreateBean()Bean实例化后,属性注入之前,执行了applyMergedBeanDefinitionPostProcessors()方法,该方法会扫描Bean的后置处理器BeanPostProcessors包含:AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor等
ClassPathBeanDefinitionScannerdoScan()扫描方法将base-package定义的扫描包,进行解析
找到Constructor实例,然后通过constructor.newInstance(args)实例化
BeanDefinitionReaderUtils调用BeanDefinitionRegistryregisterBeanDefinition
如:propertityPlaceHolder加载配置文件,填充BeanDefition中${}占位符的值
1、spring配置的读取
DefaultListableBeanFactory创建
doRegisterBeanDefinitions
populateBean()方法注入属性值给bean
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()
DefaultListableBeanFactory.getBean()
创建非懒加载的单例Bean填充属性(DI)调用BeanPostProcessor
PropertySourcesPlaceholderConfigurer.postProcessBeanFactory()->processProperties()->doProcessProperties()
读取srping xml配置文件
NameSpaceHandler解析自定义标签(如:tx、aop、context)
AbstractBeanFactory.doGetBean()
parseCustomElement处理自定义的标签,如:context/aop等
isCandidateComponent
DefaultListableBeanFactoryregisterBeanDefinition()beanDefinitionMap中putbeanName与BeanDefinition映射关系
TypeFilter tf tf.match
注册和初始化容器后处理器BeanFactoryPostProcessor
BeanFactory创建
registerBeanDefinitions
调用handler的parse方法此时会调用对应NameSpaceHandler的dohandler实现对元素的解析解析结果是BeanDefinition
finishBeanFactoryInitialization()Bean的实例化,属性值注入
8、spring IOC各环节使用到的设计模式、设计思想1、spring配置的读取2、BeanFactory的创建过程(loadBeanDefinitions)3、BeanDefition加载,如何注册到BeanDefitionRegistry4、配置文件读取,读取后如何替换占位符${}<context:propertityPlaceHolder>5、注解如何扫描,扫描后做什么处理6、AutowiredAnnotationBeanPostProcessor实现了什么9、mybatis定义MapperScannerConfigurer,为何不能注入sqlSessionFactory bean
2、BeanFactory的创建过程(loadBeanDefinitions)
loadBeanDefinitions获取spring配置文件
beanFactory.preInstantiateSingletons()
7、如何实现DI(配置和注解)Bean实例化与属性注入
AnnotationTypeFilter.matchSelf()
ClassPathBeanDefinitionScanner调用父类ClassPathScanningCandidateComponentProviderfindCandidateComponents()获取定义的扫描包下的BeanDefinition
读取contextConfigLocation获取spring配置文件
contextConfigLocation
注册和初始化Bean后置处理器BeanPostProcessor
AbstractAutowireCapableBeanFactory.createBean()->createBeanInstance()通过java发射机制,实例化bean
parseBeanDefinitions
ComponentScanBeanDefinitionParser的parse方法
finishBeanFactoryInitialization
3、BeanDefition加载,注册到BeanDefitionRegistry
收藏
0 条评论
下一页