1-spring xml 和 注解 解析过程

spring mvc 入口 DispatcherServlet,类关系图如下所示

DispatcherServlet 就是一个 Servlet,那Servlet 的初始化方法 init()在哪里,通过类图可知,可以查看 HttpServletBean 中的 init() 方法,进行 Servlet初始化.

xml解析和注解 解析入口

经过一些xml和spring 初始化配置加载后,进入AbstractApplicationContext#refresh()方法

ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

进入 AbstractRefreshableApplicationContext#refreshBeanFactory()方法,通过 loadBeanDefinitions(beanFactory) 方法解析 xml 和注解

  • xml的解析类
    AbstractXmlApplicationContext
  • 注解的解析类
    AnnotationConfigWebApplicationContext

xml 解析过程 类的流转

  • 将xml 或 properties 通过 ResourceLoader 加载为 Resource 对象,得到 Resource 对象就得到了文件所对应的 文件流,这个文件流在解析 xml 时会用到。
  • 每个 Resource 对象 都有对应的 Reader对象,Reader对象将配置封装成 BeanDefinition
  • BeanDefinition 在放入 map或容器中 

  1. ClassPathXmlApplicationContext#getConfigResources() 方法中,通过 getConfigResources() 这个方法将 所有 xml 文件封装成 Resource对象
  2. 循环 resource 对象,解析每个xml文件
    1. 进入 XmlBeanDefinitionReader 类中的 loadBeanDefinitions 方法进行xml 解析
      spring 使用 dom4j 解析xml
    2. 在 DefaultBeanDefinitionDocumentReader#parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) 方法中,通过 xml 的root根节点判断是默认的标签还是自定义的标签,分别进行解析。
    3. 通过xml根节点获取所有子节点,循环每个子节点,并判断子节点是默认标签还是自定义标分别进行解析。
    4. 将每个标签的元素解析后封装为 BeanDefinition 对象。 BeanDefinition 对象再封装为 BeanDefinitionHolder 对象,BeanDefinitionHolder包含 bean的名字、别名和 bean的BeanDefinition对象.

默认标签:import标签、alias 标签、bean 标签 、beans 标签
自定义标签:spring mvc 自定义的标签和自己扩展的标签等

BeanDefinition 说明

  • 我们会把xml里面的标签元素比如:bean、componentScan、annotation-config 等标签封装成 beanDefinition 对象
  • 我们会把 annotation比如:@Service、@Controller、@Component、@Resource 等注解封装成 BeanDefinition

自定义标签解析

  1. 命名空间 namespaceUri, 也就是 beans 标签的 xmlns 、 xmlns:context、xmlns:aop、xmlns:tx 后面uri
  2. 当解析某个标签时会 根据某个标签获取对应的命名空间uri,具体查看 BeanDefinitionParserDelegate#parseCustomElement(Element ele)方法
  3. 通过解析命名空间 uri,并实例化所对应的 命名空间处理类对象,这个解析过程会调用 命名空间处理类中的 init()方法,注册所有关于这个命名空间 有关元素的所有解析器。具体查看 DefaultNamespaceHandlerResolver#resolve(String namespaceUri)方法
  4. 调用某个命名空间的处理器的 parse方法,例如:ContextNamespaceHandler 类是 xmlns:context 的命名空间处理类

查看 xmlns:context 的命名空间

  1. 进入 spring-context 模块
  2. 进入 resources/META-INF/ 文件夹下面
  3. 查看 spring.handlers 配置文件 可以看到每个命名空间的 uri 对应一个类。
    例如 xmlns:context 对应的 uri http://www.springframework.org/schema/context 对应 ContextNamespaceHandler 类 每一个命名空间都有对应的解析类 NamespaceHandler ,每一个 命名空间解析类中都有所对应的 命名空间的元素解析器.

    http\://www.springframework.org/schema/context=org.springframework.context.config.ContextNamespaceHandler

    context 命名空间 说明

    例如:
    context找uri,beans标签中有content对应的uri。
    spring.handlers里面就有uri对应的处理类,实现NamespaceHandler接口,就会把这个命名空间对应的标签对应的处理注册进来。

如果解析标签 component-scan 时,那么解析类就是 ComponentScanBeanDefinitionParser 类,并调用 component-scan 标签对应解析类的 parse 方法进行解析

在ComponentScanBeanDefinitionParser解析类里面完成了

  1. 基本包的扫描
  2. 类型过滤器的配置
  3. annotation-config配置的兼容
  4. 注解处理器BeanPostProcessor的注册

分析 AnnotationConfigUtils.registerAnnotationConfigProcessors(readerContext.getRegistry(), source);

  1. AutowiredAnnotationBeanPostProcessor 类 就是 @Autowire 注解的支持
  2. RequiredAnnotationBeanPostProcessor 类 就是 @Required 注解的支持
  3. CommonAnnotationBeanPostProcessor 类就是对 jsr250的支持,也就是 @Resources

所有生成的beanDifinition对象都会注册缓存到beanDefinitionMap中key就是beanName,value 就是beanDefinition , 然后会把beanName放到List里面去,beanDifinitionNames 就是这个list

原文地址:https://www.cnblogs.com/zhangjianbin/p/9085388.html

时间: 2024-09-29 11:20:10

1-spring xml 和 注解 解析过程的相关文章

Spring 缓存注解解析过程

Spring 缓存注解解析过程 通过 SpringCacheAnnotationParser 的 parseCacheAnnotations 方法解析指定方法或类上的缓存注解, @Cacheable 注解将被解析为 CacheableOperation 操作, @CachePut 注解将被解析为 CachePutOperation 操作, @CacheEvict 注解将被解析为 CacheEvictOperation 操作. 缓存注解 /** * 启用Spring以注解驱动的缓存管理功能 */

Android 5.0 system_fonts.xml文件的解析过程

Android 5.0 system_fonts.xml文件的解析过程 首先看看看5.0 中familyset version="22" 的格式 20 <family name="sans-serif"> 21 <font weight="100" style="normal">Roboto-Thin.ttf</font> 22 <font weight="100"

spring.xml及注解

spring.xml配置文件中配置注解: 开启注解(及自动扫描包中bean): 1:<context:component-scan base-package="com.bzu" />    在base-packge指定所需要扫描的包,建议指定一个包含整个架构的包,可以扫描到各层所定义的bean; 或2:<context:annotation-config />   2种方法选一; 引入外部properties文件,常为数据库连接配置文件; 1:<bean

xml文件的解析过程详解

student.xml 文件展示: <?xml version="1.0" encoding="utf-8" ?> <person> <student id='1'> <name>余超</name> <sex>男</sex> <desc>一个执着而又天真的孩子</desc> </student> <student id='2'> <

iOS开发笔记3:XML/JSON数据解析

这篇主要总结在iOS开发中XML/JSON数据解析过程用到的方法.XML数据解析主要使用SAX方式的NSXMLParser以及DOM方式的GDataXML,JSON数据解析主要使用NSJSONSerialization. 1.XML解析之NSXMLParser NSXMLParser是iOS原生的XML解析方式,采用SAX方式进行解析,特点是解析的时候从根元素开始,按顺序依次对每一个元素进行解析. 以下图所示XML文档为例进行解析 (1)首先是实例化一个NSXMLParser,设置代理监听解析过

Spring 4 MVC 视图解析器(XML JSON PDF等) 纯注解(带源码)【推荐】

原文地址:http://websystique.com/springmvc/spring-4-mvc-contentnegotiatingviewresolver-example/ [本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看.源码下载地址在文章末尾.] [翻译 by 明明如月 QQ 605283073] 下一篇:Spring 4 MVC @RestController 注解实现REST Service 上一篇:Spring 4 MVC 表单校验资源处理(带源码)

Java注解及其原理以及分析spring注解解析源码

注解的定义 注解是那些插入到源代码中,使用其他工具可以对其进行处理的标签. 注解不会改变程序的编译方式:Java编译器对于包含注解和不包含注解的代码会生成相同的虚拟机指令. 在Java中,注解是被当做一个修饰符来使用的(修饰符:如public.private) 注解的常用用法:1. 附属文件的自动生成,例如bean信息类. 2. 测试.日志.事务等代码的自动生成. 单元测试例子: import org.junit.Test; public class SomeTest { @Test publi

JAVAWEB开发之Spring详解之——Spring的入门以及IOC容器装配Bean(xml和注解的方式)、Spring整合web开发、整合Junit4测试

Spring框架学习路线 Spring的IOC Spring的AOP,AspectJ Spring的事务管理,三大框架的整合 Spring框架概述 什么是Spring? Spring是分层的JavaSE/EE full-stack(一站式)轻量级开源框架. 所谓分层: SUN提供的EE的三层结构:web层.业务层.数据访问层(也称持久层,集成层). Struts2是web层基于MVC设计模式框架. Hibernate是持久的一个ORM的框架. 所谓一站式:Spring框架有对三层的每层解决方案.

Spring+Spring Boot+Mybatis框架注解解析

Restful 风格下的Spring Boot的注解开发 电商网站经常用到的restful风格 ,只是一种开发思想,不是开发框架,现在的技术并没有完全实现restful风格. restful风格是一种架构理念,完美的诠释了http协议 restful 方式需要配置一套restful风格的前端控制器,用/来标识url-pattern RequestMapping(value="/ViewItems/{id}" String id) java类里面使用@PathVariable("