接口设计描述
当BeanFactory将bean创建成功,并设置完成所有它们的属性后,我们想在这个时候
去做
出自定义的反应
,比如检查
一些强制属性
是否被设置
成功,这个时候我们可以让我们的bean的class实现InitializingBean接口,以被触发
另一种替代实现InitializingBean的可选方案是在我们的bean的类内部定义
一个init方法
,然后在xml的bean定义中添加init属性
即可触发调用
接口方法定义
该接口仅有一个afterPropertiesSet方法,该方法会在bean的所有属性被设置完成(包括各种Aware的设置,如BeanFactoryAware, ApplicationContextAware等)后由容器(BeanFactory)调用
此方法允许bean实例在设置了所有bean属性
后执行
总体配置的验证
和最终初始化
源码
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
通俗示例
我们首先定义一个Book类,类中定义一些基本属性(如name,author等)
@Component
public class Book implements InitializingBean , BeanFactoryAware {
// 基本属性
// 书名
private String name;
// 作者
private String author;
private BeanFactory beanFactory;
public Book() {
System.out.println("实例化book......");
}
@Override
public void setBeanFactory(@NonNull BeanFactory beanFactory) throws BeansException {
System.out.println("初始化beanFactoryAware属性......");
this.beanFactory = beanFactory;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("所有属性设置完成,调用InitializingBean的afterPropertiesSet方法......");
System.out.println("这里可以做一些校验逻辑......");
}
}
启动应用后打印如下:
实例化book......
初始化beanFactoryAware属性......
所有属性设置完成,调用InitializingBean的afterPropertiesSet方法......
这里可以做一些校验逻辑......
总结以下Bean的创建流程就是:
-
BeanFactory.doCreateBean(...),调用bean的构造函数实例化bean
-
BeanFactory.initializeBean(...),调用初始化方法执行bean的初始化
下面截图看下初始化的细节,主要分为四步
initializeBean.png至此我们知道了InitializingBean接口的作用就体现在初始化细节的第三步,后面还有bpp的afterInitialization方法的调用,整个初始化的流程就结束了
网友评论