注册注解BeanDefinition
AnnotationConfigWebApplicationContext 是AnnotationConfigApplicationContext 的Web 版,它们对于注解Bean 的注册和扫描是基本相同的,但是AnnotationConfigWebApplicationContext对注解Bean 定义的载入稍有不同,AnnotationConfigWebApplicationContext 注入注解Bean 定义源码如下:
//载入注解Bean定义资源
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {//为容器设置注解Bean定义读取器AnnotatedBeanDefinitionReader reader = getAnnotatedBeanDefinitionReader(beanFactory);//为容器设置类路径Bean定义扫描器ClassPathBeanDefinitionScanner scanner = getClassPathBeanDefinitionScanner(beanFactory);//获取容器的Bean名称生成器BeanNameGenerator beanNameGenerator = getBeanNameGenerator();//为注解Bean定义读取器和类路径扫描器设置Bean名称生成器if (beanNameGenerator != null) {reader.setBeanNameGenerator(beanNameGenerator);scanner.setBeanNameGenerator(beanNameGenerator);beanFactory.registerSingleton(AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR, beanNameGenerator);}//获取容器的作用域元信息解析器ScopeMetadataResolver scopeMetadataResolver = getScopeMetadataResolver();//为注解Bean定义读取器和类路径扫描器设置作用域元信息解析器if (scopeMetadataResolver != null) {reader.setScopeMetadataResolver(scopeMetadataResolver);scanner.setScopeMetadataResolver(scopeMetadataResolver);}if (!this.annotatedClasses.isEmpty()) {if (logger.isInfoEnabled()) {logger.info("Registering annotated classes: [" +StringUtils.collectionToCommaDelimitedString(this.annotatedClasses) + "]");}reader.register(this.annotatedClasses.toArray(new Class<?>[this.annotatedClasses.size()]));}if (!this.basePackages.isEmpty()) {if (logger.isInfoEnabled()) {logger.info("Scanning base packages: [" +StringUtils.collectionToCommaDelimitedString(this.basePackages) + "]");}scanner.scan(this.basePackages.toArray(new String[this.basePackages.size()]));}//获取容器定义的Bean定义资源路径String[] configLocations = getConfigLocations();//如果定位的Bean定义资源路径不为空if (configLocations != null) {for (String configLocation : configLocations) {try {//使用当前容器的类加载器加载定位路径的字节码类文件Class<?> clazz = ClassUtils.forName(configLocation, getClassLoader());if (logger.isInfoEnabled()) {logger.info("Successfully resolved class for [" + configLocation + "]");}reader.register(clazz);}catch (ClassNotFoundException ex) {if (logger.isDebugEnabled()) {logger.debug("Could not load class for config location [" + configLocation +"] - trying package scan. " + ex);}//如果容器类加载器加载定义路径的Bean定义资源失败//则启用容器类路径扫描器扫描给定路径包及其子包中的类int count = scanner.scan(configLocation);if (logger.isInfoEnabled()) {if (count == 0) {logger.info("No annotated classes found for specified class/package [" + configLocation + "]");}else {logger.info("Found " + count + " annotated classes in package [" + configLocation + "]");}}}}}
}
以上就是解析和注入注解配置资源的全过程分析。
注册注解BeanDefinition相关推荐
- Spring源码之Bean的注册(注解方式)
1.创建AnnotationConfigApplicationContext AnnotationConfigApplicationContext context = new AnnotationCo ...
- 从源码深处体验Spring核心技术--基于注解的IOC初始化
Annotation 的前世今生 从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特 ...
- 【Spring】IOC:基于注解的IOC容器初始化源码分析
从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可 ...
- Spring IOC流程源码分析
一.Spring 核心容器 IOC初始化过程 Spring 核心之 IOC 容器初体验 IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里 ...
- 一步一步手绘Spring IOC运行时序图三(基于Annotation的IOC容器初始化)
相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...
- 从Spring源码探究IOC初始化流程
随着不断地使用Spring,以及后续的Boot.cloud,不断的体会到这个拯救Java的生态体系的强大,也使我对于这个框架有了极大的好奇心,以至于产生了我为什么不能写一个这样的框架的思考. 通过自学 ...
- 21.手绘Spring IOC运行时序图
1.再谈IOC与 DI IOC(lnversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建.依赖的代码,反转给容器来帮忙实现.那么必然的我们需要创建一 ...
- Spring IOC 原理
Spring IOC原理 IOC理解 自己写的简单的IOC容器 IOC的原理 定位.加载.注册 基于XML配置的IOC容器初始化 1.寻找入口 2.获取配置路径 3.开始启动 4.创建容器 5.载入配 ...
- Spring IoC 源码系列(一)BeanDefinition 初始化与注册
一.BeanDefinition 1.1 什么是 BeanDefinition 在一般的 Spring 项目中,主要通过 XML 的方式配置 bean,而 BeanDefinition 就是 XML ...
最新文章
- php7 configure: error: Cannot find OpenSSL‘s <evp.h> 问题解决
- X-Shell远程连接虚拟机
- js的深浅拷贝( 赋值后原值被覆盖的问题 )
- TCP/IP、Http的区别
- LeetCode 205. 同构字符串(哈希map)
- 原型到底应该画到什么程度?被骂N次后我得出了答案
- linetv_linetv台湾版官方下载|line tv安卓版下载_v1.0.10_9ht安卓下载
- 打印文件出现xps_什么是XPS文件?Windows为什么要我将其打印到一个文件?
- linux如何安装php,linux下怎么安装php
- 下载维基百科wikipedia!
- Pigeon服务的注册与发现
- 可以在保利威视后台查看自己开发CMS系统帐号看了某个视频多长时间
- Apollo星火计划学习笔记——第六讲上自动驾驶感知基础(I)
- 大数据发展规划及技术详解
- JavaScript检测原始值、引用值、属性
- 用C语言打印一个金字塔
- [人工智能-深度学习-43]:输入预处理 - 规范化Normalization、标准化Standardization、正态分布、算术平均、方差
- Linux 设置多指触控手势,以 Manjaro 为例
- QML Tumbler使用介绍
- 优秀求职者应主动问的5个问题