实例化过程
验证
applicationContext.xml:
1 | <?xml version="1.0" encoding="UTF-8"?> |
Animal.java实现了各种接口
1 | package com.ytf.spring.InitBeanProcess; |
BeanPost.java实现BeanPostProcessor接口
1 | package com.ytf.spring.InitBeanProcess; |
ProveBeanInit.java 是测试类
1 | package com.ytf.spring.InitBeanProcess; |
结果
Animal Instantiation
Set Spiece:dog
Set Sex:male
BeanNameAware.setBeanName,beanId: animal
BeanFactoryAware.setBeanFactory
ApplicationContextAware.setApplicationContext
BeanPostProcessor.postProcessBeforeInitialization
Set Spiece:monkey
InitializingBean.afterPropertiesSet
Animal Init
BeanPostProcessor.postProcessAfterInitialization
Set Sex:female
Spiece:monkey;Sex:female
DisposableBean.destroy
Animal Destroy
可见,初始化顺序确实如图说明。
注意问题
- 如果去掉BeanPost,改为Animal实现BeanPostProcessor,会导致BeanPostProcessor的两个方法不运行。
- 网上有说使用注解@PostConstruct、@PreDestroy 代替 init-method,destroy-method,实际运行发现并不是一样的,换成注解,产生的结果如下:
Animal Instantiation
BeanNameAware.setBeanName,beanId: animal
BeanFactoryAware.setBeanFactory
ApplicationContextAware.setApplicationContext
BeanPostProcessor.postProcessBeforeInitialization
Set Spiece:monkey
Animal Init
InitializingBean.afterPropertiesSet
BeanPostProcessor.postProcessAfterInitialization
Set Sex:female
Spiece:monkey;Sex:female
Animal Destroy
DisposableBean.destroy