- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
聊聊spring的那些扩展机制
1.背景
慎⼊:本⽂将会有⼤量代码出⼊。
在看⼀些框架源码的时候,可以看见他们很多都会和Spring去做结合。举个例⼦dubbo的配置:
很多⼈其实配置了也就配置了,没有去过多的思考:为什么这么配置spring就能识别,dubbo就能启动?
如果你也需要做⼀个框架和Spring结合,或者你想知道Spring其他框架是如何和Spring做结合的,那么你应该了解⼀下Spring的扩展机制。
2.如何扩展
本篇⽂章想从Spring的两个流程去介绍如何扩展,⼀个是容器初始化流程,⼀个是Bean的创建流程。
2.1 容器的初始化
要想使⽤Spring,第⼀步肯定是需要先让容器初始化。在AbstractApplicationContext中有⼀个refresh⽅法定义了容器如何进⾏刷新:
在refresh中的具体流程如下图:
其中⽐较常见的扩展在加载BeanDefinition中和执⾏BeanPostProcessor。下⾯讲述⼀下如何进⾏这两个的扩展。
2.1.1 加载BeanDefinition
在介绍加载BeanDefinition之前,先让我们了解⼀下什么是BeanDefinition,顾名思义BeanDefinition描述Bean的信息的,⽐如他的class信
息,属性信息,是否是单例,是否延迟加载等。
如何加载呢?⼀般有两种⼿段,⼀个是通过我们的xml,⼀个是通过⼀些扩展⼿段。
xml加载如下:
我们在spring的XML中配置这样⼀个bean的定义,他会进⾏解析然后转换成我们的BeanDefinition。
还有种⽅式是通过XML schema扩展的⽅式,关于xsd的⼀些详细介绍可以参考这篇⽂章:。有些同学会问不是还有个注解的⽅式吗?我们在
学的时候⼀般书上都写XML和注解两种⽅式,注解其实也是使⽤了XML schema的扩展机制,等会我会细讲。
XML schema扩展
什么是XML schema的扩展呢?
Spring允许你⾃⼰定义XML的的结构并且可以⽤⾃⼰的bean解析器进⾏解析。这⾥参考⼀下进⾏⾃定义扩展的4个步骤:
编写⼀个 XML schema⽂件描述的你节点元素。 在resources/META-INF/⽬录下定义demo.xsd⽂件。这⾥定义了⼀个demo的节点元
素,其中定义了⼀个name字段。
编写⼀个 NamespaceHandler的实现类
编写⼀个或者多个 BeanDefinitionParser的实现 (关键步骤).
注册上述的 schema和 handler。在resources/META-INF/⽬录下⾯创建spring.handler⽂件输⼊:
http\:///schema/demo = xsd.DemoNameSpaceHandler
复制代码
,这⼀步将我们之前的标签的url映射到我们NamespaceHandler。再创建⼀个spring.schemas⽂件,输⼊:
http\://www.demo.me/schema/demo/demo.xsd= META-INF/demo.xsd
复制代码
这⼀步将xsd的url进⾏了映射。
回到注解,⼤家配置注解的时候⼀般都是使⽤下图进⾏配置:
但是可以看见其依然是使⽤XML schema扩展进⾏处理,在Spring中有个叫ContextNamespaceHandler,注册很多解析器:其中有⼀个解析器
是compnent-scan,在他的parse⽅法中定义了如何进⾏注解扫描,获取注解:
利⽤这个扩展机制的还有AOP,MVC,Spring-Cache以及我们的⼀些开源框架⽐如Dubbo等。
BeanFactoryPostProcessor扩展
这个机制可以让我们在真正的实例化Bean之前对BeanDefinition进⾏修改。
这⾥我举例⼀个实战的例⼦,想必⼤家很多都配置过数据库连接池吧,这⾥拿Druid来举例:
然后我们创建⼀个perties输⼊:
url=jdbc:mysql://localhost:3306/test
username=root
password=123456
复制代码
对于这种配置⾃⼰玩玩已经满⾜,但是在公司有个问题,密码放在项⽬中明码存储,这样是不⾏的,别⼈只要获得了你项⽬的查看权限那么
密码就会被泄漏,所以⼀般的公司会有⼀个统⼀的密码存储服务,只有⾜够的权限才能够使⽤,那么我们可以把密码放在统⼀存储服务中,
通过对服务的调⽤才能进⾏密码的使⽤,那么我们怎么把从远程服务中获取到的密
您可能关注的文档
最近下载
- 巨人 通力电梯NOVA GKE调试说明书故障代码GPN15 GVN15_GKE - 51668093D01-2022.pdf VIP
- 吕梁学院《高等数学下》2025 - 2026学年第一学期期末试卷(A卷).docx VIP
- 抖音超火看表情符号猜成语PPT.pptx VIP
- 德龙ICK6000冰淇淋机说明书.pdf
- 昂科威S用户手册.doc VIP
- DB45T12302015红树林湿地生态系统固碳能力评估技术规程.pdf VIP
- 难点详解人教版8年级数学上册《全等三角形》专项训练试题(解析卷).docx VIP
- 难点详解人教版8年级数学上册《全等三角形》专项训练练习题.docx VIP
- 铁路连续梁桥线形监控量测系统使用培训.pdf
- 麻醉危机管理情境模拟教学 .pdf VIP
文档评论(0)