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相关推荐

  1. Spring源码之Bean的注册(注解方式)

    1.创建AnnotationConfigApplicationContext AnnotationConfigApplicationContext context = new AnnotationCo ...

  2. 从源码深处体验Spring核心技术--基于注解的IOC初始化

    Annotation 的前世今生 从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特 ...

  3. 【Spring】IOC:基于注解的IOC容器初始化源码分析

    从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可 ...

  4. Spring IOC流程源码分析

    一.Spring 核心容器 IOC初始化过程 Spring 核心之 IOC 容器初体验 IOC 与 DI IOC(Inversion of Control)控制反转:所谓控制反转,就是把原先我们代码里 ...

  5. 一步一步手绘Spring IOC运行时序图三(基于Annotation的IOC容器初始化)

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) 一步一步手绘Spring IOC运行时序图一(Spring 核心容器 IOC初始化过程) 一步一步手绘Spring IOC运行时序图二(基于XM ...

  6. 从Spring源码探究IOC初始化流程

    随着不断地使用Spring,以及后续的Boot.cloud,不断的体会到这个拯救Java的生态体系的强大,也使我对于这个框架有了极大的好奇心,以至于产生了我为什么不能写一个这样的框架的思考. 通过自学 ...

  7. 21.手绘Spring IOC运行时序图

    1.再谈IOC与 DI IOC(lnversion of Control)控制反转:所谓控制反转,就是把原先我们代码里面需要实现的对象创 建.依赖的代码,反转给容器来帮忙实现.那么必然的我们需要创建一 ...

  8. Spring IOC 原理

    Spring IOC原理 IOC理解 自己写的简单的IOC容器 IOC的原理 定位.加载.注册 基于XML配置的IOC容器初始化 1.寻找入口 2.获取配置路径 3.开始启动 4.创建容器 5.载入配 ...

  9. Spring IoC 源码系列(一)BeanDefinition 初始化与注册

    一.BeanDefinition 1.1 什么是 BeanDefinition 在一般的 Spring 项目中,主要通过 XML 的方式配置 bean,而 BeanDefinition 就是 XML ...

最新文章

  1. php7 configure: error: Cannot find OpenSSL‘s <evp.h> 问题解决
  2. X-Shell远程连接虚拟机
  3. js的深浅拷贝( 赋值后原值被覆盖的问题 )
  4. TCP/IP、Http的区别
  5. LeetCode 205. 同构字符串(哈希map)
  6. 原型到底应该画到什么程度?被骂N次后我得出了答案
  7. linetv_linetv台湾版官方下载|line tv安卓版下载_v1.0.10_9ht安卓下载
  8. 打印文件出现xps_什么是XPS文件?Windows为什么要我将其打印到一个文件?
  9. linux如何安装php,linux下怎么安装php
  10. 下载维基百科wikipedia!
  11. Pigeon服务的注册与发现
  12. 可以在保利威视后台查看自己开发CMS系统帐号看了某个视频多长时间
  13. Apollo星火计划学习笔记——第六讲上自动驾驶感知基础(I)
  14. 大数据发展规划及技术详解
  15. JavaScript检测原始值、引用值、属性
  16. 用C语言打印一个金字塔
  17. [人工智能-深度学习-43]:输入预处理 - 规范化Normalization、标准化Standardization、正态分布、算术平均、方差
  18. Linux 设置多指触控手势,以 Manjaro 为例
  19. QML Tumbler使用介绍
  20. 优秀求职者应主动问的5个问题

热门文章

  1. JVM内存区域(运行时数据区)划分
  2. Scala中的Map使用例子
  3. web 前端基本框架
  4. spec文件中的 %pre %post %preun %postun
  5. 通向架构师的道路(第六天)之漫谈基于数据库的权限系统的设计
  6. 【java reflection】反射工具类总结
  7. Struts初步知识
  8. 【Python之os模块】使用
  9. config对象的使用及常用方法
  10. HTML 块标签,行内标签,行内块标签以及之间的相互转换