聊聊spring的那些扩展机制.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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 复制代码 对于这种配置⾃⼰玩玩已经满⾜,但是在公司有个问题,密码放在项⽬中明码存储,这样是不⾏的,别⼈只要获得了你项⽬的查看权限那么 密码就会被泄漏,所以⼀般的公司会有⼀个统⼀的密码存储服务,只有⾜够的权限才能够使⽤,那么我们可以把密码放在统⼀存储服务中, 通过对服务的调⽤才能进⾏密码的使⽤,那么我们怎么把从远程服务中获取到的密

文档评论(0)

134****3224 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档