Spring框架的IOC容器之bean的生命周期


Spring Bean的生命周期

生命周期

1.调用类的初始化方法(通过构造器 和或 getter setter 为bean的属性注入)

2.调用bean的初始化方法(init-method)

3.调用bean的析构方法(destroy-method) 该方法在ioc容器调用close()方法的时候会调用

BeanPostProcessor接口

1.有两个回调方法。

2.当一个BeanPostProcessor的实现类注册到Spring IOC容器后,对于该Spring IOC容器所创建的每个bean实例在初始化方法(如afterPropertiesSet和任意已声明的init方法)调用前,将会调用BeanPostProcessor中的postProcessBeforeInitialization方法,而在bean实例初始化方法调用完成后,则会调用BeanPostProcessor中的postProcessAfterInitialization方法

3.整个调用顺序可以简单示意如下:

  1. Spring IOC容器实例化Bean (调用类的构造器 )
  2. 调用BeanPostProcessor的postProcessBeforeInitialization方法
  3. 调用bean实例的初始化方法(init-method)
  4. 调用BeanPostProcessor的postProcessAfterInitialization方法
  5. 调用bean实例的初始化方法(destory-method)

可以看到,Spring容器通过BeanPostProcessor给了我们一个机会对Spring管理的bean在进行bean调用inti-method前后再加工。比如:我们可以修改bean的属性,可以给bean生成一个动态代理实例等等。一些Spring AOP的底层处理也是通过实现BeanPostProcessor来执行代理包装逻辑的。

使用方法:

创建一个实现BeanPostProcessor接口的类,实现上述的两种方法;在xml配置文件中写入

在实现BeanPostProcessor接口的类的两种方法中 Object bean, String beanName 。 bean代表bean的实例本身,beanName代表bean的名字。返回值即放回到容器中的bean可以随意修改的!

如:

<!--不需要进行特殊配置 ioc容器会自动识别-->
<bean class="com.an.cycle.MyBeanPostProcessor"/>
public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization"+beanName+","+bean);
        return bean;
    }
    
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization"+beanName+","+bean);
        Car car = (Car)bean;
        ((Car) bean).setPrice(999.0);
        return bean;
    }
}

文章作者: Bxan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Bxan !
  目录