1.Bean 的實(shí)例化
public class AbstractAutowireCapableBeanFactory{
protected Object doCreateBean(**){
..
if (instanceWrapper == null) {
instanceWrapper = this.createBeanInstance(beanName, mbd, args);
}
..
}
}
2.Bean 的屬性注入(DI)
public class AbstractAutowireCapableBeanFactory{
protected Object doCreateBean(**){
..
populateBean(beanName, mbd, instanceWrapper);
..
}
}
3.初始化
public class AbstractAutowireCapableBeanFactory{
protected Object doCreateBean(**){
..
exposedObject = initializeBean(beanName, exposedObject, mbd);
..
}
}
里面分了幾步
private void invokeAwareMethods(String beanName, Object bean) {
if (bean instanceof Aware) {
if (bean instanceof BeanNameAware) {
((BeanNameAware) bean).setBeanName(beanName);
}
if (bean instanceof BeanClassLoaderAware) {
ClassLoader bcl = getBeanClassLoader();
if (bcl != null) {
((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);
}
}
if (bean instanceof BeanFactoryAware) {
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
}
}
}
if (mbd == null || !mbd.isSynthetic()) {
//---------------------------Bean生命周期一部分,調(diào)用postProcessAfterInitialization-----------------------
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
1. 實(shí)現(xiàn)了BeanNameAware接口的話,Spring將Bean的Id傳遞給setBeanName()方法
2. 實(shí)現(xiàn)了BeanClassLoaderAware接口的話胸梆,Spring將getBeanClassLoader傳給Bean
3. 如果Bean實(shí)現(xiàn)了BeanFactoryAware接口的話敦捧,Spring將調(diào)用setBeanFactory()方法,將BeanFactory容器實(shí)例傳入
4. 如果Bean 實(shí)現(xiàn)了BeanPostProcessor接口碰镜,Spring就將調(diào)用他們的postProcessAfterInitialization()方法兢卵。
此時(shí),Bean已經(jīng)準(zhǔn)備就緒绪颖,他們將一直駐留在應(yīng)用上下文中秽荤,直到應(yīng)用上下文被銷毀。但是如果bean實(shí)現(xiàn)了DisposableBean接口柠横,pring將調(diào)用它的destory()接口方法窃款,同樣,如果bean使用了destory-method 聲明銷毀方法牍氛,該方法也會(huì)被調(diào)用晨继。