【spring源码分析】配置文件到BeanDefinition
2021-03-31 14:41:55 0 举报
从XML配置文件到 BeanDefinition源码分析过程
作者其他创作
大纲/内容
真正处理BeanDefinition的方法doLoadBeanDefinitions(...): 1、解析xml中数据,转化为Document 实例。 (1)、获取指定资源验证模式(getValidationModeForResource(...)) (2)、加载document(this.documentLoader.loadDocument(...)) 2、根据 Document 实例,注册 Bean 信息 (1)、创建BeanDefinitionDocumentReader 对象 (2)、获取已经注册BeanDefinition的数量 (3)、创建 XmlReaderContext 对象,并注册b style=\
ClassRelativeResourceLoader
InputStreamResource
【资源加载 ---> BeanDefinition过程】
Resource
PropertiesBeanDefinitionReader
FileSystemResource
XmlBeanDefinitionReader : 1、解析Resource资源,需要先将资源进行EncodeResource下,以保证内容读取的正确性。 2、loadBeanDefinitions(...)方法: (1)、从ThreadLocal 中获取当前正在加载的XML bean定义资源的集合。 (2)、将当前需要解析的资源放入到解析资源集合中。 (3)、将EncodeResource转化为InputResource,然后调用真正解析Resouce的方法b style=\
XmlBeanDefinitionReader
资源加载 ---> BeanDefinition 源码分析过程
DefaultBeanDefinitionDocumentReader
文本
FileSystemResource加载绝对路径资源
注册列表
getValidationModeForResource(Resource resource)方法: 1、获取指定的验证模式(VALIDATION_AUTO); 2、若是手动指定的模式,则直接返回该模式; 3、检测验证模式(根据传入的资源) (1)默认为XSD 模式; (2)若解析资源中包含“DOCTYPE”则为 DTD模式; (3)若解析资源中这一行有 < ,并且 < 后面跟着的是字母,则为XSD模式; (4)若过程中有CharConversionException,则为AUTO模式。 4、若是检查出来的模式是手动模式,则直接返回该模式; 5、若以上都没有返回任何模式,则最终返回XSD模式。
BeanDefinition
主线
【扩展点】:如果需要自定义Resolverfont color=\"#000000\" style=\"font-weight: bold;\
ClassPathResource resource = new ClassPathResource(\"beans.xml\"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory); reader.loadBeanDefinitions(resource);
【扩展点】:可以自定义命名空间。 1.创建一个需要扩展的组件。 2.定义一个XSD文件描述组件内容。 3.创建一个文件,实现BeanDefinitionParser接口,用来解析XSD文件中的定义和组件定义。font style=\"\
GenericApplicationContext
DefaultResourceLoader # getResource方法,获取Resource的步骤1、Resource :通过ProtocolResolver 协议获取的Resource;2、ClassPathContextResource:以“/”开头的获取的资源;3、ClassPathResource:以\"classpath:\" 开头获取的资源;4、FileUrlResource | UrlResource :协议是“file”或者“vfsfile”或者“vfs”通过FileUrlResourcec处理,否则通过UrlResource处理来获取资源;5、ClassPathContextResource:MalformedURLException异常的时候,进行处理;
UrlResource
【扩展点】:如果要实现自定义 Resource,我们只需要继承 AbstractResource 即可,但是有了 ProtocolResolver 后,我们不需要直接继承 DefaultResourceLoader,改为实现 ProtocolResolver 接口也可以实现自定义的 ResourceLoader。
创建Document对象:调用font color=\"#ff0000\
Spring在提供了ResourceLoader接口之后,还提供了一个对其进行了增强的ResourcePatternResolver接口来扩展ResourceLoader。除了继承自Resource的方法外,ResourcePatternResolver额外扩充了一个方法,用来批量加载Resource资源对象。ResourcePatternResolver支持了\"classpath*:\"开头的资源路径形式。 支持根据指定的资源路径匹配模式每次返回多个 Resource 实例。
DefaultBeanDefinitionDocumentReader:doRegisterBeanDefinitions(...)方法: 1、记录旧的 BeanDefinitionParserDelegate 对象; 2、创建 BeanDefinitionParserDelegate 对象,并进行设置到 delegate; 3、检查 <beans /> 根标签的命名空间,并处理profile属性; 4、解析前处理, 5、解析处理, a.默认命名空间解析:import【导入Bean定义资源】、alias【处理别名注册】、bean【处理beanDefinition】、beans【注册beanDefinition】 b.自定义命名空间解析: 6、解析后处理。
DefaultResourceLoader
BeanDefinitionRegistry
FileSystemResourceLoader
SimpleBeanDefinitionRegistry
ClassRelativeResourceLoader的扩展点:根据给定的class所在包或者所在包的子包下加载资源。
PathMatchingResourcePatternResolver
一、PathMatchingResourcePatternResolver 支持\"classpath*:\" 前缀外,还支持 Ant 风格的路径匹配模式(类似于 \"**/*.xml\")二、getResource()方法: 1、以\"classpath*:\" 开头, (1)路径包含通配符处理,#findPathMatchingResources(...) 方法加载资源。该方法处理根路径、子路径下的资源,并将bundle 、vfs、jar、其它类型等资源转化为UrlResource资源进行返回。 (2)路径不包含通配符处理,#findAllClassPathResources(...) 方法加载资源。该方法返回 classes 路径下和所有 jar 包中的所有相匹配的资源。【实际上返回UrlResource】 2、不以 \"classpath*:\" 开头 (1)路径包含通配符处理,#findPathMatchingResources(...) (2)路径不包含通配符处理,直接委托给相应的 ResourceLoader 来实现。
资源加载器
ResourcePatternResolver
ByteArrayResource
其实,该处传的是DefaultListableBeanFactory,而DefaultListableBeanFactory 实现了BeanDefinitionRegistry。DefaultListableBeanFactory主要充当两个作用,font color=\"#000000\
ResourceLoader
【扩展点】:继承DefaultBeanDefinitionDocumentReader 并实现preProcessXml()方法和postProcessXml()。来扩展对document 的解析前或者解析后的处理
GroovyBeanDefinitionReader
AbstractBeanDefinitionReader
DefaultListableBeanFactory
注册BeanDefinition信息
ClasspathResource
0 条评论
下一页