转-Spring bean处理-InitializingBean&BeanPostProcessor&BeanFactoryPostProcessor

转自  http://elim.iteye.com/blog/2017466

执行顺序:

BeanFactoryPostProcessor.postProcessBeanFactory
UserBean‘s constructor
UserBean ‘s username property set
BeanPostProcessor.postProcessBeforeInitialization
InitializingBean.afterPropertiesSet
BeanPostProcessor.postProcessAfterInitialization

Spring bean处理——回调函数

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

InitializingBean接口

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

Java代码

  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对应的方法。

Java代码

  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接口

Java代码

  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. }
时间: 2024-10-13 10:35:21

转-Spring bean处理-InitializingBean&BeanPostProcessor&BeanFactoryPostProcessor的相关文章

Spring Bean InitializingBean和DisposableBean实例

在Spring中,InitializingBean和DisposableBean是两个标记接口,为Spring执行时bean的初始化和销毁某些行为时的有用方法. 对于Bean实现 InitializingBean,它将运行 afterPropertiesSet()在所有的 bean 属性被设置之后. 对于 Bean 实现了DisposableBean,它将运行 destroy()在 Spring 容器释放该 bean 之后. 示例 下面是一个例子,向您展示如何使用 InitializingBea

Spring Bean Life Cycle Methods – InitializingBean, DisposableBean, @PostConstruct, @PreDestroy and *Aware interfaces

Spring Beans are the most important part of any Spring application. Spring ApplicationContext is responsible to initialize the Spring Beans defined in spring bean configuration file. Spring Context is also responsible for injection dependencies in th

8、spring注解学习(bean的生命周期)——让Bean实现InitializingBean,DisposableBean这两个接口进而实现初始和销毁方法

1.创建Tiger类实现InitializingBean,DisposableBean接口,并通过@Component将该组件注入 @Component public class Tiger implements InitializingBean,DisposableBean{ public Tiger() { System.out.println("Tiger的构造方法执行了..."); } /** * 此方法就是在调用构造方法之后属性都赋完值就执行 */ @Override pub

Spring Bean的生命周期(非常详细)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 转载请注明地址 http://www.cnblogs.com/zrtqsk/p/3735273.html,谢谢. 一.生命周期流程图: Spri

Spring8:一些常用的Spring Bean扩展接口

前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP----开闭原则,即: 1.保证对修改关闭,即外部无法修改Spring整个运作的流程 2.提供对扩展开放,即可以通过继承.实现Spring提供的众多抽象类与接口来改变类加载的行为 开卷有益,阅读Spring源码(无需每个类都看得很细,大体流程能梳理出来即可)对于个人水平的提升是帮助非常大

Spring Bean的生命周期(非常详细)(转载)

Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring容器.这里,我们讲的也是 ApplicationContext中Bean的生命周期.而实际上BeanFactory也是差不多的,只不过处理器需要手动注册. 转载请注明地址 http://www.cnblogs.com/zrtqsk/p/3735273.html,谢谢. 一.生命周期流程图: Spri

Spring Bean生命周期详解

对象生命周期:创建(实例化----初始化)---使用----销毁,而在Spring中,Bean对象周期当然遵从这一过程,但是Spring提供了许多对外接口,允许开发者对三个过程(实例化.初始化.销毁)的前后做一些操作.在Spring Bean中,实例化是为Bean对象开辟空间(构造函数),初始化则是对属性的初始化,属性注入(setter方法注入属性). 1.Bean自身方法:init-method/destroy-method,通过为配置文件bean定义中添加相应属性指定相应执行方法. 2.Be

Spring Bean的生命周期详解

Spring Bean的生命周期详解 Spring IoC容器的本质目的就是为了管理Bean,对于Bean而言,在容器中存在其生命周期,它的初始化和销毁也需要一个过程,下面主要对其生命周期进行一个详解的解释.生命周期主要是为了了解Spring IoC容器初始化和销毁Bean的过程,通过下图即可以掌握Spring IoC容器初始化与销毁Bean的过程. 通过上图,我们首先可以看到生命周期的步骤. 1)如果Bean实现了接口 BeanNameAware 的 setBeanName 方法,那么它就会调

Spring bean的作用域以及生命周期

一.request与session的区别 request简介 request范围较小一些,只是一个请求. request对象的生命周期是针对一个客户端(说确切点就是一个浏览器应用程序)的一次请求,当请求完毕之后,request里边的内容也将被释放点 . 简单说就是你在页面上的一个操作,request.getParameter()就是从上一个页面中的url.form中获取参数. 但如果一个request涉及多个类,后面还要取参数,可以用request.setAttribute()和request.