BeanFactory中bean的生命周期

本文详细介绍了Spring框架中Bean的生命周期,包括从初始化容器到实例化Bean的过程,以及在此过程中涉及的各种回调方法。还展示了如何使用InstantiationAwareBeanPostProcessor和BeanPostProcessor接口来扩展Bean的生命周期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • BeanFactory在初始化容器,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean。
    这里写图片描述

    1. 当调用者通过getBean()向容器请求某一个Bean时,如果容器注册了org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,则在实例化Bean之前调用postProcessBeforeInstantiation()方法。

    2. 根据配置情况调用Bean构造函数或者工厂方法实例化Bean。

    3. 如果容器注册了 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口,则在实例化Bean之后,调用该接口的postProcessAfterInstantiation()方法。

    4. 如果Bean配置了属性信息,则在设置属性之前将调用 org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor接口的postProcessPropertyValues()方法。

    5. 调用Bean的属性设置方法设置属性值。

    6. 如果Bean实现了org.springframework.beans.factory.BeanNameAware接口,则将调用setBeanName()方法,将配置文件的Bean名称设置到Bean中。

    7. 如果Bean实现了org.springframework.beans.factory.BeanFactoryAware接口,则将调用setBeanFactory()方法,将BeanFactory容器实例设置到Bean中。

    8. 如果BeanFactory装配了org.springframework.beans.factory.config.BeanPostProcessor后处理器,则将调用接口的postProcessBeforeInitialization()方法对Bean进行加工操作。

    9. 如果Bean实现了org.springframework.beans.factory.InitializingBean接口,则将调用接口的afterPropertiesSet()方法。

    10. 如果在《bean》《/bean》标签中init-method属性定义了初始化方法,则将执行这个方法。

    11. 如果BeanFactory装配了org.springframework.beans.factory.config.BeanPostProcessor后处理器,则将调用接口的postProcessAfterInitialization()方法对Bean再次进行加工操作。

    12. 对于scope=”singleton”(默认),则将Bean放入springIOC容器的缓存池中,并将引用返回给调用者,spring继续对这些Bean进行后续的生命管理。对于scope=”prototype”,则将Bean返回给调用者,调用者负责Bean的后续生命的管理,spring不再管理这个Bean的生命周期。

    13. 对于scope=”singleton”(默认),容器关闭时,将触发spring对Bean的后续生命周期的管理。如果Bean实现了org.springframework.beans.factory.DisposableBean接口,则将调用接口的destroy()方法,可以编写释放日志,记录日志等。

    14. 对于scope=”singleton”(默认)的Bean,如果在《bean》《/bean》标签中destory-method属性定义了Bean的销毁方法,则spring将执行这个方法。

package com.test.pojo;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;

public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {

    //在实例化bean之前执行
    public Object postProcessBeforeInstantiation(Class beanClass, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if("car".equals(beanName)){
            System.out.println("这是postProcessBeforeInstantiation方法===");
        }
        return null;
    }
    //在实例化bean之后执行
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if("car".equals(beanName)){
            System.out.println("这是postProcessAfterInstantiation方法===");
        }
        return true;
    }
    //在设置那个属性的值的时候执行
    public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean,
            String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if("car".equals(beanName)){
            System.out.println("这是postProcessPropertyValues方法===");
        }
        return pvs;
    }

}
package com.test.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Car implements BeanFactoryAware,BeanNameAware,InitializingBean,DisposableBean{

    private String brand;
    private String color;
    private int maxSpeed;

    private String beanName;
    private BeanFactory beanFactory;

    public Car() {
        System.out.println("====调用构造函数====");
    }

    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("调用InitializingBean.afterPropertiesSet()。");
    }


    public void setBeanName(String name) {
        // TODO Auto-generated method stub
        System.out.println("调用了BeanNameAware.setBeanName()。");
        this.beanName=name;
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("调用了BeanFactoryAware.setBeanFactory()。");
        this.beanFactory=beanFactory;
    }


    public void destroy() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("这是DisposableBean.destory()的方法");
    }
    public void myInit(){
        System.out.println("这是我指定的初始化方法,默认将maxSpeed设为240。");
        this.maxSpeed=240;
    }
    public void myDestory(){
        System.out.println("这是我的销毁方法");
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        System.out.println("这是setBrand方法");
        this.brand = brand;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        System.out.println("这是setColor方法");
        this.color = color;
    }

    public int getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(int maxSpeed) {
        System.out.println("这是setMaxSpeed方法");
        this.maxSpeed = maxSpeed;
    }

    @Override
    public String toString() {
        return "Car [brand=" + brand + ", color=" + color + ", maxSpeed=" + maxSpeed+"]";
    }

}
package com.test.pojo;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {


    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if("car".equals(beanName)){
            Car car=(Car)bean;
            if(car.getColor()==null){
                System.out.println("这是postProcessBeforeInitialization方法===");
                car.setColor("黑色");;
            }

        }
        return bean;
    }


    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        if("car".equals(beanName)){
            Car car=(Car)bean;
            if(car.getMaxSpeed()>=200){
                System.out.println("postProcessAfterInitialization方法===");
                car.setMaxSpeed(200);
            }
        }
        return bean;
    }

}
package com.test.spring;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import com.test.pojo.Car;
import com.test.pojo.MyBeanPostProcessor;
import com.test.pojo.MyInstantiationAwareBeanPostProcessor;
public class StudentSpring {
    protected Logger logger = Logger.getLogger(this.getClass());


    public static void main(String[] args) {
        Resource resource = new ClassPathResource("spring/applicationContext-dao.xml");
        BeanFactory bf=new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader((DefaultListableBeanFactory)bf);
        reader.loadBeanDefinitions(resource);
        ((DefaultListableBeanFactory)bf).addBeanPostProcessor(new MyBeanPostProcessor());
        ((DefaultListableBeanFactory)bf).addBeanPostProcessor(new MyInstantiationAwareBeanPostProcessor());
        Car car1 = (Car)bf.getBean("car");
        Car car2 = (Car)bf.getBean(Car.class);
        System.out.println(car1.toString()+"::"+car2.toString());
        System.out.println(car1==car2);
        ((DefaultListableBeanFactory)bf).destroySingletons();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值