经过createBeanInstance获取了BeanWrapper,之后通过调用populateBean实现了属性的填充,一个真正可以使用的bean马上就可以出师了:
本篇分析bean的初始化:处理Aware,后置处理器,init方法等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/**
* 初始化给定的bean实例,应用工厂回调以及init方法和bean后处理器。
* 对于传统定义的bean,从{@link #createBean}调用,对于现有bean实例,从{@link #initializeBean}调用。
*
* @param beanName 工厂中的bean名称(用于调试)
* @param bean 我们可能需要初始化新的bean实例
* @param mbd 创建bean时使用的bean定义(如果给定一个现有bean实例,也可以是{@code null})
* @return 初始化的bean实例(可能被包装)
* @see BeanNameAware 要由希望在bean工厂中知道其bean名称的bean实现的接口。
* @see BeanClassLoaderAware 实现该aware后spring会把加载业务bean类时使用的类加载器暴露出来。
* @see BeanFactoryAware 将BeanFactory暴露给用户,也可以直接@autowired注入。
* BeanFactory只声明了一些基本方法,如getBean,containsBean,isPrototype,isSingleton等,
* ApplicationContext继承了BeanFactory,它有自己的很多扩展方法(容器启动日期,容器id,他还实现了事件接口,可以发布事件等等)。
* @see #applyBeanPostProcessorsBeforeInitialization 前置处理
* @see #invokeInitMethods 执行init方法
* @see #applyBeanPostProcessorsAfterInitialization 后置处理
*/
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {

//用于辅助Spring Bean编程访问Spring容器,将一些特殊的spring内部bean暴露给业务应用
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
} else {
invokeAwareMethods(beanName, bean);
}

Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
//前置处理
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}

try {
//执行init方法
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()) {
//后置处理
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}

return wrappedBean;
}

这个方法是为了增强Spring的功能,通过暴露核心类,使用户能自定义处理。

tencent.jpg