Spring bean处理——回调函数

Spring中定义了三个可以用来对Spring bean或生成bean的BeanFactory进行处理的接口,InitializingBean、BeanPostProcessor和BeanFactoryPostProcessor。通过实现这三个接口我们就可以对Spring bean进行处理了。

InitializingBean接口

InitializingBean中定义了一个afterPropertiesSet()方法。当BeanFactory将我们的bean实例化并且设置好了对应的属性之后,如果我们的bean实现了InitializingBean接口,则会调用对应的afterPropertiesSet()方法。那么我们就可以在这个方法体里面对当前bean的属性进行更改等其它操作。

  1. @Component("beanA")
  2. public class BeanA implements InitializingBean {
  3. /**
  4. * 回调函数,会在bean属性设置完成后调用
  5. */
  6. public void afterPropertiesSet() throws Exception {
  7. System.out.println("回调函数,会在bean属性设置完成后调用");
  8. }
  9. }

BeanPostProcessor接口

BeanPostProcessor接口实现类可以在bean初始化前后对bean做一些处理。ApplicationContext可以自动检测到其中的bean是否已实现了BeanPostProcessor接口,如果已经实现了该接口它会自动把它当做一个BeanPostProcessor进行处理。然后在需要调用BeanPostProcessor时进行调用。BeanPostPorcessor中定义了两个方法,postProcessBeforeInitialization()和postProcessAfterInitialization()。

l  postProcessBeforeInitialization(Object bean, String beanName)方法将在调用bean的初始化方法之前被调用。方法参数分别表示当前的bean对象和对应的bean名称。

l  postProcessAfterInitialization(Object bean, String beanName)方法将在调用bean的初始化方法之后被调用。

BeanPostProcessor是针对于容器中的所有的bean的。一旦容器中定义有BeanPostProcessor,那么容器中的每一个bean在初始化前后都会调用BeanPostProcessor对应的方法。

  1. @Component
  2. public class MyBeanPostProcessor implements BeanPostProcessor {
  3. /**
  4. * 任何bean对象在初始化方法回调之后都会调用BeanPostProcessor的
  5. * postProcessAfterInitialization方法。我们可以在该方法体里面对返回的bean再做一层封装。
  6. * 调用该方法前,我们传递进来的bean对象是已经填充好了属性值的。当我们把BeanPostProcessor作为
  7. * 一个bean定义在ApplicationContext中时,ApplicationContext会自动检测到它并把它当做
  8. * 一个BeanPostProcessor进行调用。
  9. */
  10. public Object postProcessAfterInitialization(Object bean, String beanName)
  11. throws BeansException {
  12. System.out.println(bean + "after initialization, beanName is " + beanName);
  13. return bean;
  14. }
  15. /**
  16. * 任何bean对象在初始化方法回调之前都会调用BeanPostProcessor的
  17. * postProcessBeforeInitialization方法。调用该方法前,我们传递进来的
  18. * bean对象是已经填充好了属性值的。
  19. */
  20. public Object postProcessBeforeInitialization(Object bean, String beanName)
  21. throws BeansException {
  22. System.out.println(bean + "beforeInitialization, beanName is " + beanName);
  23. return bean;
  24. }
  25. }

BeanFactoryPostProcessor接口

  1. BeanFactoryPostProcessor接口实现类可以在当前BeanFactory初始化后,bean实例化之前对BeanFactory做一些处理。BeanFactoryPostProcessor是针对于bean容器的,在调用它时,BeanFactory只加载了bean的定义,还没有对它们进行实例化,所以我们可以通过对BeanFactory的处理来达到影响之后实例化bean的效果。跟BeanPostProcessor一样,ApplicationContext也能自动检测和调用容器中的BeanFactoryPostProcessor。
  2. @Component
  3. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  4. /**
  5. * BeanFactoryPostProcessor的postProcessBeanFactory()方法会在当前BeanFactory初始化
  6. * 以后,并且所有的bean定义都已经被加载,但是还没有对应的实例时被调用。所以我们可以在该方法体里面通过
  7. * BeanFactory做一些操作。当我们把BeanFactoryPostProcessor作为一个bean定义在ApplicationContext中时,
  8. * ApplicationContext会自动检测到它并把它当做一个BeanFactoryPostProcessor进行调用。
  9. */
  10. public void postProcessBeanFactory(
  11. ConfigurableListableBeanFactory beanFactory) throws BeansException {
  12. System.out.println("postProcessBeanFactory......");
  13. }
  14. }

最新文章

  1. Leetcode 365. Water and Jug Problem
  2. gcc编译器用法(自学总结)
  3. ToolProvider.getSystemJavaCompiler() Return NULL!
  4. H5新特性 input type=date 在手机上默认提示显示无效解决办法
  5. WAP端 穿透问题和解决方法
  6. Netty
  7. C# 类型运算符重载在类继承中的调用测试
  8. jQuery訪问属性,绝对定位
  9. HTML 总结-表单-表单属性
  10. SimpleInjector与MVC4集成,与Web Api集成,以及通过属性注入演示
  11. JS 数组及函数
  12. javaCV图像处理之Frame、Mat和IplImage三者相互转换(使用openCV进行Mat和IplImage转换)
  13. Docker入门学习
  14. java跟oracle如何计算时间差
  15. My new Blog on cnblogs
  16. 致备战noip2018的勇士
  17. jupyter notebook不能选择虚拟环境的解决方法
  18. asp 读cookie 下划线 丢失
  19. undefined reference 问题各种情况分析
  20. poj2462

热门文章

  1. python list dict 去重的两种方式
  2. 【Kubernetes】K8S 网络隔离 方案
  3. Select For update语句浅析 (转)
  4. ThinkPHP之登录验证
  5. mcd, lm, VS lx
  6. ASP.NET MVC轻教程 Step By Step 12——客户端验证
  7. UVaLive4043 UVa1411 Ants 巨人与鬼
  8. Ftp协议Socket实现
  9. ARM64调试环境
  10. oracle数据库使用心得之与SQL serve数据库的差异
  11. 运维笔记-----nginx反向代理
  12. Redis持久化persistence
  13. 融云亮相GDG谷歌女性开发者大会 揭秘IMSDK网络优化策略
  14. Advertising.csv
  15. Restful API设计规范
  16. 【Go语言】基本的语法
  17. 通过MFC设计一个简单的计价程序
  18. ZooKeeper系列(10):ZooKeeper与Dubbo的结合
  19. BBS--后台管理页面,编辑文章,xss攻击
  20. Leetcode 763. Partition Labels