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实现相结合。

最新文章

  1. 2.Android 自定义通用的Item布局
  2. OC字符串的一些常用的函数。
  3. 怎样使用AutoLayOut为UIScrollView添加约束
  4. SQL server 2008 Express Edition实现自动备份和自动删除备份
  5. C#基础--局部类型Partial
  6. ftp文件操作
  7. 【Visual C++】绘图函数BitBlt的使用方法
  8. CMap与hash_map效率对照
  9. jdk和cglib简单理解(转)
  10. 201521123005 《java程序设计》 第六周学习总结
  11. 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql
  12. 启动Docker容器
  13. java笔试要点(java.sql包)
  14. PHP通过经纬坐标计算两个地址的距离
  15. 根据URL地址获取对应的HTML,根据对应的URL下载图片
  16. TFS2018 连接 K8S集群的方法
  17. Python之路(第五篇) Python基本数据类型集合、格式化、函数
  18. underscore.js源码解析(一)
  19. 【转】np.linspace()、np.logspace()、np.arange()
  20. 配合前端开发,调试前端页面bug

热门文章

  1. java基础之IO流(二)之字符流
  2. VC/MFC中计算程序运行时间
  3. yum gd linux
  4. Halcon导出的cpp, VC++环境配置
  5. NPOI操作Excel 005:写入空Excel(Winform版)
  6. 系统重装 如何转换GPT的磁盘格式为MBR或者反过来
  7. HDU2897( 巴什博奕变形)
  8. easyui datagrid client搜索、分页、排序
  9. android-problem——remount of /system failed: Read-only file system
  10. postgres启动过程分析