1.SPRING扩展机制
- 通过基于XML和基于Java的配置扩展,可以使用户通过Spring使用我们研发的组件,提供很好的易用性。
- 通过Spring容器最常用的两个扩展点:
BeanFactoryPostProcessor
和BeanPostProcessor
,可以使我们的程序逻辑和Spring容器紧密合作,无缝插入到用户bean的生命周期中,发挥更强大的作用。
2.spring的扩展接口
- 1. FactroyBean 我们熟悉的AOP基础bean
- 2. BeanPostProcess 在每个bena初始化成前后做操作。
- 3. InstantiationAwareBeanPostProcessor 在Bean实例化前后做一些操作。
- 4. BeanNameAware、ApplicationContextAware 和 BeanFactoryAware 针对bean工厂,可以获取上下文,可以获取当前bena的id。
- 5. BeanFactoryPostProcessor Spring允许在Bean创建之前,读取Bean的元属性,并根据自己的需求对元属性进行改变,比如将Bean的scope从singleton改变为prototype。
- 6. InitialingBean 在属性设置完毕后做一些自定义操作 DisposableBean 在关闭容器前做一些操作。
相关知识
一扩展方式
1。基于XML配置的扩展
1.首先需要定义一套XML Schema来描述组件所提供的功能。schema中就需要描述我们期望用户提供的namespace以及namespace之间的排序等元数据。
2.除了XML Schema,我们还需要创建一个自定义的NamespaceHandler来负责解析用户在XML中的配置。
- 为了简化代码,我们一般会继承一个helper类:
NamespaceHandlerSupport
,然后在init
方法中注册处理我们自定义节点的BeanDefinitionParser - 自定义的BeanDefinitionParser负责解析xml中的
config
节点信息,记录用户的配置信息,为后面和Spring整合做好铺垫。
3.注册Spring handler和Spring schema,让Spring解析xml配置文件的过程中识别我们的自定义节点,并且转交到我们的NamespaceHandler
处理。
- 1)首先需要在META-INF目录下创建一个spring.handlers文件,来配置我们自定义的XML Schema Namespace到我们自定义的NamespaceHandler映射关系。
- 2)在META-INF目录下创建一个spring.schemas,来配置我们自定义的XML Schema地址到实际Jar包中的classpath映射关系(避免Spring真的去服务器上下载不存在的文件)
2.基于Java配置的扩展
从Spring 3.0开始,一种新的基于Java的配置方式出现了。
通过这种方式,我们在开发Spring项目的过程中再也不需要去配置繁琐的xml文件了,只需要在Configuration类中配置就可以了,大大的简化了Spring的使用。
另外,这也是Spring Boot默认的配置方式,所以建议也支持这一特性。
2.1 @Import注解
支持Java配置扩展的关键点就是@Import
注解,Spring 3.0提供了这个注解用来支持在Configuration类中引入其它的配置类,包括Configuration类, ImportSelector和ImportBeanDefinitionRegistrar的实现类。
我们可以通过这个注解来引入自定义的扩展Bean。
2.2 自定义注解
和基于XML配置类似的,我们需要提供给用户一个注解来配置需要注入到Spring Property Sources的namespaces和order。