实例化过程流程图
实例化过程
查看源码如何实例化bean
1.找到doCreateBean方法,查看调用createBeanInstance方法
2.调用instantiateBean方法,使用默认构造器实例化bean
3.调用instantiate接口方法,获取构造器
4.调用instantiateClass方法,返回 bean对象
初始化过程
查看源码如何初始化bean
1.填充属性,上面doCreateBean方法中,先去实例化bean,拿到的bean对象值全是空的,下面需要对bean对象赋值,也就是填充属性。同样在doCreateBean方法找调用填充属性方法populateBean
2.调用initializeBean方法,初始化bean
这个方法非常重要,里面有调用aware方法,前置处理,调用Init-method方法, 后置处理,分析下里面的代码
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
//调用Aware方法,为什么调用aware方法?
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
//前置处理
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()) {
//后置处理
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
3.执行Aware方法,为什么要执行Aware方法?
在bean对象中分为两种,一种用户自己定义的bean,一种是容器的bean,Aware接口是为了让自定义对象方便获取容器对象。可以看到BeanFactory接口中注释说明,完整的bean生命周期中,有大量关于Aware接口,调用aware接口时全是set方法,这样后期可以方便使用
4.前置处理,调用applyBeanPostProcessorsBeforeInitialization方法,完成前置处理
5.调用init-method方法
6.后置处理,调用applyBeanPostProcessorsAfterInitialization方法
看下后置处理如何用动态代理的
找到applyBeanPostProcessorsAfterInitialization方法,点击postProcessAfterInitialization接口方法
点击postProcessAfterInitialization,找到AbstractAutoProxyCreator类,查看子类实现
点击wrapIfNecessary方法
点击createProxy方法
点击getProxy方法
继续往下面点击getProxy方法,找到AopProxy,aop代理接口,然后看getProxy的子类实现,可以看到有两种实现方式,一种是cglib代理,一种是JDK代理