Spring的拓展机制

原文连接:Spring中的那些扩展机制

如何扩展

本篇文章想从Spring的两个流程去介绍如何扩展,一个是容器初始化流程,一个是Bean的创建流程进行

容器的初始化

要想使用Spring,第一步肯定是需要先让容器初始化。在AbstractApplicationContext中有一个refresh方法定义了容器如何进行刷新。
其中比较常见的扩展在加载BeanDefinition中和执行BeanPostProcessor。下面讲述一下如何进行这两个的扩展。

加载BeanDefinition

在介绍加载BeanDefinition之前,先让我们了解一下什么是BeanDefinition,顾名思义BeanDefinition描述Bean的信息的,比如他的class信息,属性信息,是否是单例,是否延迟加载等。

如何加载呢?一般有两种手段,一个是通过我们的xml,一个是通过一些扩展手段。
我们在spring的XML中配置这样一个bean的定义,他会进行解析然后转换成我们的BeanDefinition。

还有种方式是通过XML schema扩展的方式,关于xsd的一些详细介绍可以参考这篇文章:Spring中的XML schema扩展机制。有些同学会问不是还有个注解的方式吗?我们在学的时候一般书上都写XML和注解两种方式,注解其实也是使用了XML schema的扩展机制,等会我会细讲。

XML schema扩展

什么是XML schema的扩展呢?

Spring允许你自己定义XML的的结构并且可以用自己的bean解析器进行解析。这里参考一下Spring中的XML schema扩展机制进行自定义扩展的4个步骤:

  1. 编写一个 XML schema 文件描述的你节点元素。
  2. 编写一个 NamespaceHandler 的实现类
  3. 注册上述的 schema 和 handler。 在resources/META-INF/ 目录下面创建spring.handler文件输入: http\://www.demo.com/schema/demo = xsd.DemoNameSpaceHandler
  4. 这一步将我们之前的标签的url映射到我们NamespaceHandler。 再创建一个spring.schemas文件,输入:http\://www.demo.me/schema/demo/demo.xsd= META-INF/demo.xsd
    这一步将xsd的url进行了映射。

利用这个扩展机制的还有AOP,MVC,Spring-Cache以及我们的一些开源框架比如Dubbo等。

BeanFactoryPostProcessor扩展

这个机制可以让我们在真正的实例化Bean之前对BeanDefinition进行修改。

这里我举例一个实战的例子,想必大家很多都配置过数据库连接池吧,这里拿Druid来举例

xml配置好后,我们创建一个druid.properties输入:

url=jdbc:mysql://localhost:3306/test
username=root
password=123456

对于这种配置自己玩玩已经满足,但是在公司有个问题,密码放在项目中明码存储,这样是不行的,别人只要获得了你项目的查看权限那么密码就会被泄漏,所以一般的公司会有一个统一的密码存储服务,只有足够的权限才能够使用,那么我们可以把密码放在统一存储服务中,通过对服务的调用才能进行密码的使用,那么我们怎么把从远程服务中获取到的密码注入到我们Bean中呢?那么就要使用我们的BeanFactoryPostpRrocessor。

通过这种方式我们可以有几个好处:

  • 设置统一配置中心,那么我们不需要修改我们项目中的文件,只需要在配置中心页面中修改即可。
  • 设置统一密码中心,那么我们不需要暴露明文在项目中,密码如何保护那么就直接丢给密码中心即可。

Bean的创建

通过GetBean操作进行获取,前面我们讲到过如果是非延迟加载的单例Bean那么会在容器刷新的时候进行加载,如果是延迟加载的Bean那么会在我们获取Bean的时候根据BeanDefinition进行加载。 首先在AbstractBeanFactory有两个方法一个是doCreate,一个是create用来描述如何创建一个Bean。

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值