Spring-beans-BeanPostProcessor/InitializingBean

1.Bean的初始化(InitializingBean)
早期的spring xml形式,如果配置bean的时候,写法如下

<bean id = "beanId" class="全限定名" init-method="abc"></bean>

上面的意思是如果有这样一个类,那么当这个类中所有的属性都赋值完毕之后,则会调用该类的abc方法

public class A{
	@Resource
    public B b;
    
	public void abc(){
		System.out.println("属性B已被填充完毕,执行初始化方法abc");
	}   
}

后来xml形式逐渐被淘汰了,我们可以使用实现InitializingBean接口的方法设置初始化方法,代码就变成了下面这样

public class A  implements InitializingBean{
	@Resource
    public B b;
    
    // 顾名思义,在类A的所有属性填充完毕之后(本类的只有1个属性b)
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("属性B已被填充完毕,执行初始化方法abc");
    }  
}

上述的afterPropertiesSet就叫做初始化方法,初始化方法一定是在属性填充完毕之后才执行的,这也叫Bean的初始化(指的就是执行这方法)

2.Bean的初始化前后处理(BeanPostProcessor)
如果想在Bean的初始化之前做一些事情,之后再做一些事情,则需要实现BeanPostProcessor接口

@Component
public class MyPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("初始化方法afterPropertiesSet之前执行");
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("初始化方法afterPropertiesSet之后执行");
        return bean;
    }
}

注意:假如一个类C没有实现InitializingBean接口,那么理论上C是没有初始化方法的,但这并不妨碍BeanPostProcessor挂载到这个类C上,这个时候会在类C的所有属性初始化之后,直接调用postProcessBeforeInitialization方法,综上所属,我们可以假装认为这个类C存在一个空的初始化方法,这样就好理解了

进一步得出结论:如果有一个类实现了BeanPostProcessor,那么spring容器中所有的bean都会执行BeanPostProcessor接口里的那两个方法,而如果一个类实现了InitalizingBean,那么该类自己实例化的时候,会执行InitalizingBean接口里的方法,而不影响其他bean的流程

顺序
1.BeanPostProcess before
2.InitalizingBean after
3.BeanPostProcess after

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值