1)实例化Bean
调用createBean方法根据Bean定义进行实例化。
2)属性填充
根据Bean定义进行属性填充。
3)处理Aware接口
1.如果实现了BeanNameAware接口,就调用实现的setBeanName方法。传递配置的BeanId。
2.如果实现了BeanFactoryAware接口,就调用实现的setBeanFactory方法。传递spring工厂自己。
3.如果实现了ApplicationContextAware接口,就调用实现的setApplicationContext方法。传递spring上下文。
4)处理BeanPostProcessor
如果Bean实现了BeanPostProcessor接口,那么将会调用postProcessBeforeInitialization方法。
5) 处理init-method
如果配置了 init-method 属性,就会调用他的初始化方法。
6)处理BeanPostProcessor
如果Bean实现了BeanPostProcessor接口,那么将会调用postProcessAfterInitialization方法。
到这里bean就可用了
7)处理DisposableBean
如果Bean实现了DisposableBean接口,就调用实现的destory方法。
8)处理destroy-method
如果配置了 destroy-method 属性,就会调用他的销毁方法。
// 主要在AbstractAutowireCapableBeanFactory类里面
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// ......
if (instanceWrapper == null) {
//实例化bean
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// ......
Object exposedObject = bean;
try {
//属性填充
populateBean(beanName, mbd, instanceWrapper);
//初始化
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
// ......
try {
//注册销毁的方法
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
}
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
//处理aware接口
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
//处理aware接口
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
//BeanPostProcessors前置处理器
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
//初始化方法
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
//BeanPostProcessors后置处理器
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
protected void invokeInitMethods(String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
throws Throwable {
//InitializingBean
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isTraceEnabled()) {
logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
((InitializingBean) bean).afterPropertiesSet();
return null;
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
((InitializingBean) bean).afterPropertiesSet();
}
}
//init-method
if (mbd != null && bean.getClass() != NullBean.class) {
String initMethodName = mbd.getInitMethodName();
if (StringUtils.hasLength(initMethodName) &&
!(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}