Spring中的扩展点
Spring作为一个常用的IOC框架,在设计上预留了很多的扩展点,很多第三方开源框架,包括Spring自身也是基于这些扩展点实现的,这很好的体现了对修改关闭、对扩展开放的原则。总的来说Spring的扩展点有下面三类:
一、BeanFactoryPostProcess接口
该接口实现类是在Spring容器加载了Bean的定义文件之后,在Bean的创建实例化之前执行,可以修改Bean的定义属性,即其实现类可以在Spring容器实例化对象前读取并修改配置元数据。接口方法的入参是ConfigurrableListableBeanFactory,使用该参数,可以获取到相关bean的定义信息。spring中,有内置的一些BeanFactoryPostProcessor实现类,常用的有:
- org.springframework.beans.factory.config.PropertyPlaceholderConfigurer
- org.springframework.beans.factory.config.PropertyOverrideConfigurer
- org.springframework.beans.factory.config.CustomEditorConfigurer:用来注册自定义的属性编辑器
二、BeanPostProcessor接口
BeanPostProcessor,可以在spring容器实例化bean之后,在执行bean的初始化方法前后,添加一些自己的处理逻辑。这里说的初始化方法,指的是下面两种:
1)bean实现了InitializingBean接口,对应的方法为afterPropertiesSet
2)在bean定义的时候,通过init-method设置的方法
注意:BeanPostProcessor是在spring容器加载了bean的定义文件并且实例化bean之后执行的。BeanPostProcessor的执行顺序是在BeanFactoryPostProcessor之后。
spring中,有内置的一些BeanPostProcessor实现类,例如:
- org.springframework.context.annotation.CommonAnnotationBeanPostProcessor:支持@Resource注解的注入
- org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor:支持@Required注解的注入
- org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor:支持@Autowired注解的注入
- org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor:支持@PersistenceUnit和@PersistenceContext注解的注入
- org.springframework.context.support.ApplicationContextAwareProcessor:用来为bean注入ApplicationContext等容器对象
这些注解类的BeanPostProcessor,在spring配置文件中,可以通过这样的配置 <context:component-scan base-package="*.*" /> ,自动进行注册。(spring通过ComponentScanBeanDefinitionParser类来解析该标签)
三、FactoryBean接口
通过实现FactoryBean接口,实现类可以完全自定义Bean的创建实例化过程,从而实现更自由的扩展定制。比如Shiro框架中的ShiroFilterFactoryBean,通过返回一个实现标准Filter接口的Bean实例Bean,和Spring IOC容器的代理Filter实现相结合。
最新文章
- 2.Android 自定义通用的Item布局
- OC字符串的一些常用的函数。
- 怎样使用AutoLayOut为UIScrollView添加约束
- SQL server 2008 Express Edition实现自动备份和自动删除备份
- C#基础--局部类型Partial
- ftp文件操作
- 【Visual C++】绘图函数BitBlt的使用方法
- CMap与hash_map效率对照
- jdk和cglib简单理解(转)
- 201521123005 《java程序设计》 第六周学习总结
- 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql
- 启动Docker容器
- java笔试要点(java.sql包)
- PHP通过经纬坐标计算两个地址的距离
- 根据URL地址获取对应的HTML,根据对应的URL下载图片
- TFS2018 连接 K8S集群的方法
- Python之路(第五篇) Python基本数据类型集合、格式化、函数
- underscore.js源码解析(一)
- 【转】np.linspace()、np.logspace()、np.arange()
- 配合前端开发,调试前端页面bug
热门文章
- java基础之IO流(二)之字符流
- VC/MFC中计算程序运行时间
- yum gd linux
- Halcon导出的cpp, VC++环境配置
- NPOI操作Excel 005:写入空Excel(Winform版)
- 系统重装 如何转换GPT的磁盘格式为MBR或者反过来
- HDU2897( 巴什博奕变形)
- easyui datagrid client搜索、分页、排序
- android-problem——remount of /system failed: Read-only file system
- postgres启动过程分析