Spring关于Bean的生命周期

Bean常用实现接口

  • BeanNameAware
void setBeanName(String name);

设置bean的名字

  • BeanFactoryAware
void setBeanFactory(BeanFactory beanFactory) throws BeansException;

设置bean的bean工厂

  • InitializingBean
void afterPropertiesSet() throws Exception;

属性设置之后额外的设置

  • DisposableBean
void destroy() throws Exception;

销毁方法,资源释放

针对所有Bean的处理

  • BeanPostProcessor
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
	return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
	return bean;
}
  • InstantiationAwareBeanPostProcessor,继承自BeanPostProcessor接口,是它的子接口,扩展了两个方法
	@Nullable
	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
		return null;
	}
	default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
		return true;
	}
	@Nullable
	default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName)
			throws BeansException {
		return null;
	}

自定义一个BeanPostProcessor

@Component
public class HelloBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof HelloUtil) {
            System.out.println("*****BeanPostProcessor.postProcessBeforeInitialization方法");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof HelloUtil) {
            System.out.println("*****BeanPostProcessor.postProcessAfterInitialization方法");
        }
        return bean;
    }
}

自定义一个InstantiationAwareBeanPostProcessor

@Component
public class HelloInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof HelloUtil) {
            System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization方法");
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof HelloUtil) {
            System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessAfterInitialization方法");
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanClass == HelloUtil.class) {
            System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法");
        }
        return null;
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (bean instanceof HelloUtil) {
            System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法");
        }
        return true;
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if (bean instanceof HelloUtil) {
            System.out.println("*****InstantiationAwareBeanPostProcessor.postProcessProperties方法");
        }
        return pvs;
    }
}

自定义一个实现相关接口的Bean

public class HelloUtil implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("*****set方法");
        this.name = name;
    }

    public HelloUtil() {
        System.out.println("*****默认构造方法");
    }

    @PostConstruct
    public void init() {
        System.out.println("*****PostConstruct方法");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("*****PreDestroy方法");
    }


    @Override
    public void setBeanName(String name) {
        System.out.println("*****BeanNameAware.setBeanName方法");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("*****BeanFactoryAware.setBeanFactory方法");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("*****DisposableBean.destroy方法");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("*****InitializingBean.afterPropertiesSet方法");
    }
}

运行测试

public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
        HelloUtil helloUtil = context.getBean(HelloUtil.class);
        System.out.println(helloUtil.getName());
        context.close();
    }

结果输出

*****InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法
*****默认构造方法
*****set方法
*****InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法
*****InstantiationAwareBeanPostProcessor.postProcessProperties方法(InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation返回为true才调用)
*****BeanNameAware.setBeanName方法
*****BeanFactoryAware.setBeanFactory方法
*****BeanPostProcessor.postProcessBeforeInitialization方法
*****InstantiationAwareBeanPostProcessor.postProcessBeforeInitialization方法
*****PostConstruct方法
*****InitializingBean.afterPropertiesSet方法
*****BeanPostProcessor.postProcessAfterInitialization方法
*****InstantiationAwareBeanPostProcessor.postProcessAfterInitialization方法
Hello World
*****PreDestroy方法
*****DisposableBean.destroy方法

源码位置
https://gitee.com/ceclar123/spring-boot-demo/tree/master/ch03

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值