Spring初始化方法的执行顺序及其原理分析
在Spring容器启动时,会按照一定的规则初始化Bean,并在Bean初始化后执行一些定制化的操作。
BeanFactoryPostProcessor
在Spring容器启动时,第一步会执行BeanFactoryPostProcessor,它可以修改Bean的定义元数据,它的执行顺序是固定的,并且它只会被执行一次。BeanFactoryPostProcessor的典型应用之一是PropertyPlaceholderConfigurer,它会将配置文件中的${xxx}参数替换成对应的值。
示例:
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("MyBeanFactoryPostProcessor postProcessBeanFactory");
}
}
BeanPostProcessor
在执行完BeanFactoryPostProcessor后,Spring会继续初始化Bean,并在Bean初始化前后执行BeanPostProcessor。BeanPostProcessor是在Bean初始化的过程中被执行的,可以修改Bean实例,包括增加和替换Bean的属性。BeanPostProcessor的执行顺序是不确定的,但是在同一个容器中,BeanPostProcessor的执行顺序是固定的。
示例:
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanPostProcessor postProcessBeforeInitialization : " + beanName);
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("MyBeanPostProcessor postProcessAfterInitialization : " + beanName);
return bean;
}
}
InitializingBean和init-method
InitializingBean和init-method是Bean初始化的最后两个方法。如果一个Bean实现了InitializingBean接口,在Bean初始化后,Spring会自动调用它的afterPropertiesSet方法。如果一个Bean在定义中指定了init-method,则在Bean初始化后,Spring会自动调用指定的方法。
示例1(通过实现InitializingBean完成Bean初始化):
public class MyInitializingBean implements InitializingBean {
private String name;
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("MyInitializingBean afterPropertiesSet : " + name);
}
public void setName(String name) {
this.name = name;
}
}
示例2(通过指定init-method完成Bean初始化):
public class MyInitMethodBean {
private String name;
public void init() {
System.out.println("MyInitMethodBean init : " + name);
}
public void setName(String name) {
this.name = name;
}
}
总结
Spring初始化方法的执行顺序如下:
- BeanFactoryPostProcessor:修改Bean的定义元数据;
- BeanPostProcessor:在Bean初始化前后执行,可以修改Bean实例;
- InitializingBean和init-method:在Bean初始化的最后执行,完成Bean的初始化。
在实际应用中,我们可以通过BeanFactoryPostProcessor和BeanPostProcessor对Bean进行定制化操作,通过实现InitializingBean和指定init-method来完成Bean的初始化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:spring初始化方法的执行顺序及其原理分析 - Python技术站