Skip to content

Commit 513663b

Browse files
committed
doc: 主要是针对createBean和doCreateBean流程的个人理解中文注释和添加一些测试类
流程描述: 1.InitDestroyAnnotationBeanPostProcessor的postProcessBeforeInstantiation自定前实例化方法 2.如果上面没有自定义则走spring的doCreateBean流程 2.1 通过推断构造方法拿到bean对象,也就是实例化完成 2.2 实例化完成之后,调用MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition方法,可以在这个方法完成对我们的BeanDefinition进行一些扩展,因为这个是在属性填充和初始化之前调用,所以可以在这里提前进行一些propertyValue bean的属性设置,或者initMethodName等设置 2.3 进行属性填充populateBean调用 2.3.1 调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法 2.3.2 完成bean属性里面的autowired流程的设置(注意这里并不是@Autowired注解,而是历史的autowired属性模式) 2.3.3 进行@Autowired\@resource等注入 2.3.4 如果存在propertyValue则通过这里的属性进行一个设置 2.4 进行bean的初始化调用initializeBean方法 2.4.1 invokeAwareMethods主要是调用beanNameAware等回调 2.4.2 调用beanPostProcessor的before方法 2.4.3 调用初始化方法(包括InitializingBean接口的方法和initMethodName方法) 2.4.4 调用beanPostProcessor的after方法 完成bean的创建
1 parent 1ca2814 commit 513663b

File tree

15 files changed

+332
-16
lines changed

15 files changed

+332
-16
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/config/InstantiationAwareBeanPostProcessor.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,15 @@
2323
import org.springframework.lang.Nullable;
2424

2525
/**
26+
*
27+
* <p>
28+
* 这个BeanPostProcessor,Spring在实例化bean的时候也就是new bean的时候,
29+
* 会先判断系统中是否存在InstantiationAwareBeanPostProcessor,如果存在则循环调用里面的
30+
* postProcessBeforeInstantiation方法,判断是否使用自定义的方式去new一个bean,
31+
* 如果返回不为null也就是我们使用自己定义的方式去new bean,那么spring就不会在通过推断构造方法的方式去new bean
32+
* 尽管使用这种方式new的bean,spring也会依然走BeanPostProcessor的after方法去完成AOP流程
33+
* </p>
34+
*
2635
* Subinterface of {@link BeanPostProcessor} that adds a before-instantiation callback,
2736
* and a callback after instantiation but before explicit properties are set or
2837
* autowiring occurs.
@@ -42,9 +51,14 @@
4251
* @see org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#setCustomTargetSourceCreators
4352
* @see org.springframework.aop.framework.autoproxy.target.LazyInitTargetSourceCreator
4453
*/
45-
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
54+
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
4655

4756
/**
57+
* 这个方法的作用就是通过这个方法,我们可以自定义我们bean的new方法,不使用spring默认的流程
58+
* 如果返回了一个具体的对象拿就表示使用我们自定义的这个new方法,所以是在create bean最前置的时候调用的
59+
* 如果调用了这个方法后续的spring很多流程都不一样,不过最后的AOP流程是一样的也会走beanPostProcessor的after方法
60+
* <p></p>
61+
*
4862
* Apply this BeanPostProcessor <i>before the target bean gets instantiated</i>.
4963
* The returned bean object may be a proxy to use instead of the target bean,
5064
* effectively suppressing default instantiation of the target bean.
@@ -74,6 +88,12 @@ default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanNam
7488
}
7589

7690
/**
91+
* 这个方法的作用就是在实例化之后调用,
92+
* 也就是当一个对象被new实例化之后,在属性填充和初始化之前调用的一个流程;
93+
* 你可以在属性填充之前或者在初始化之前做一些操作去影响后续的一些流程,
94+
* 需要注意的是参数bean因为还没属性填充和初始化,所以里面很多东西都是空的
95+
* <p></p>
96+
*
7797
* Perform operations after the bean has been instantiated, via a constructor or factory method,
7898
* but before Spring property population (from explicit properties or autowiring) occurs.
7999
* <p>This is the ideal callback for performing custom field injection on the given bean
@@ -93,6 +113,9 @@ default boolean postProcessAfterInstantiation(Object bean, String beanName) thro
93113
}
94114

95115
/**
116+
*
117+
*
118+
*
96119
* Post-process the given property values before the factory applies them
97120
* to the given bean, without any need for property descriptors.
98121
* <p>Implementations should return {@code null} (the default) if they provide a custom

spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java

Lines changed: 65 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -511,9 +511,13 @@ protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable O
511511
// Make sure bean class is actually resolved at this point, and
512512
// clone the bean definition in case of a dynamically resolved Class
513513
// which cannot be stored in the shared merged bean definition.
514+
/**
515+
* 去加在我们beanName对应的那个class
516+
*/
514517
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
515518
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
516519
mbdToUse = new RootBeanDefinition(mbd);
520+
// 这个时候把加载好的class设置到beanClass里面,表示已经加载完了,下一次就不会在需要去加载class了
517521
mbdToUse.setBeanClass(resolvedClass);
518522
}
519523

@@ -526,7 +530,17 @@ protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable O
526530
beanName, "Validation of method overrides failed", ex);
527531
}
528532

533+
// ------------------------
534+
// 加载好了bean,开始进行实例化
535+
529536
try {
537+
/**
538+
* 在实例化之前的处理,这里有一个特殊的BeanPostProcessor叫做InstantiationAwareBeanPostProcessor
539+
* 这个BeanPostProcessor可以让我们使用我们自己的方式去newInstance一个bean,而不是让spring我们调用构造方法去new bean对象
540+
* 所以在这里面会判断系统是否有InstantiationAwareBeanPostProcessor,如果有则循环调用这些PostProcessor然后去调用方法
541+
* 如果这个方法返回的非null,则表达使用了这个InstantiationAwareBeanPostProcessor去new对象,也就直接返回了不会走后面spring的流程
542+
* 在这个流程中也会走到BeanPostProcessor的after进行一些AOP操作
543+
*/
530544
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
531545
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
532546
if (bean != null) {
@@ -539,6 +553,7 @@ protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable O
539553
}
540554

541555
try {
556+
// 如果上面没有走自定义的New bean方法,那么就走spring的实例化
542557
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
543558
if (logger.isTraceEnabled()) {
544559
logger.trace("Finished creating instance of bean '" + beanName + "'");
@@ -578,16 +593,21 @@ protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable
578593
if (mbd.isSingleton()) {
579594
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
580595
}
596+
// 一般流程会走下面的逻辑,创建bean的实例,会走推断构造方法逻辑
597+
// 实例化
581598
if (instanceWrapper == null) {
582599
instanceWrapper = createBeanInstance(beanName, mbd, args);
583600
}
601+
// 拿到我们的bean对象
584602
Object bean = instanceWrapper.getWrappedInstance();
585603
Class<?> beanType = instanceWrapper.getWrappedClass();
586604
if (beanType != NullBean.class) {
587605
mbd.resolvedTargetType = beanType;
588606
}
589607

590608
// Allow post-processors to modify the merged bean definition.
609+
// 当上面bean实例化之后,会判断系统中是否包含MergedBeanDefinitionPostProcessor列表,如果包含了则会调用这个对象中的
610+
// postProcessMergedBeanDefinition方法
591611
synchronized (mbd.postProcessingLock) {
592612
if (!mbd.postProcessed) {
593613
try {
@@ -603,6 +623,7 @@ protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable
603623

604624
// Eagerly cache singletons to be able to resolve circular references
605625
// even when triggered by lifecycle interfaces like BeanFactoryAware.
626+
// 处理循环依赖的问题
606627
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
607628
isSingletonCurrentlyInCreation(beanName));
608629
if (earlySingletonExposure) {
@@ -616,7 +637,9 @@ protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable
616637
// Initialize the bean instance.
617638
Object exposedObject = bean;
618639
try {
640+
// 属性填充
619641
populateBean(beanName, mbd, instanceWrapper);
642+
// 前面是实例化也就是new,现在是对bean进行初始化
620643
exposedObject = initializeBean(beanName, exposedObject, mbd);
621644
}
622645
catch (Throwable ex) {
@@ -658,6 +681,7 @@ else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
658681

659682
// Register bean as disposable.
660683
try {
684+
// 初始化完成之后,需要做一些为销毁bean的准备
661685
registerDisposableBeanIfNecessary(beanName, bean, mbd);
662686
}
663687
catch (BeanDefinitionValidationException ex) {
@@ -1127,13 +1151,15 @@ protected void applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, C
11271151
@Nullable
11281152
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
11291153
Object bean = null;
1130-
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
1154+
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) { // 已经使用了InstantiationAwareBeanPostProcessor初始化了,就不需要在初始化了
11311155
// Make sure bean class is actually resolved at this point.
1156+
// 这个bean不是一个合成的bean对象如果是的话不需要创建bean,并且系统中包含了InstantiationAwareBeanPostProcessor的Bean
11321157
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
11331158
Class<?> targetType = determineTargetType(beanName, mbd);
11341159
if (targetType != null) {
1160+
// 循环所有的InstantiationAwareBeanPostProcessor进行before,如果返回不为空说明使用自定义的创建bean的方法
11351161
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
1136-
if (bean != null) {
1162+
if (bean != null) { // 使用了自定义创建Bean的方法也要走完完整的BeanPostProcessor的after,用来AOP操作
11371163
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
11381164
}
11391165
}
@@ -1156,6 +1182,8 @@ protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition
11561182
*/
11571183
@Nullable
11581184
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
1185+
// 循环InstantiationAwareBeanPostProcessor,进行调用判断是否有返回值,第一个有返回值的就直接返回了
1186+
// 所以如果有多个InstantiationAwareBeanPostProcessor都可以返回,则只会使用第一个
11591187
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
11601188
Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
11611189
if (result != null) {
@@ -1395,6 +1423,9 @@ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable B
13951423
// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
13961424
// state of the bean before properties are set. This can be used, for example,
13971425
// to support styles of field injection.
1426+
// 一个非合成的正常的bean对象,判断系统中是否有InstantiationAwareBeanPostProcessor的BeanPostProcessor
1427+
// 如果存在则调用它的postProcessAfterInstantiation方法
1428+
// 所以这个流程也就是调用在实例化之后,属性填充和初始化流程之前
13981429
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
13991430
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
14001431
if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
@@ -1404,7 +1435,15 @@ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable B
14041435
}
14051436

14061437
PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
1407-
1438+
/**
1439+
* 这段流程是兼容的历史的版本,spring现在已经不这么推荐我们去注入属性的时候使用这种方式了
1440+
* 当我们在xml或者在@Bean中,可以设置一个属性叫做autowired,可以通过这种设置来让我们创建bean填充里面的属性的时候使用byName或者byType的方式
1441+
* 比如我们的A bean中有一个属性是B bean我们需要创建一个setB的方法
1442+
* 如果我们使用byType,spring就会去找B这个bean给我们自动赋值到b这个属性上
1443+
* 如果我们使用了byName的方式,就会去找setB这个方法上的B(注意是方法名称截取set),去找对应的bean设置到属性上
1444+
* 也就是如果我们设置了autowire属性,spring就会找你bean里面所有的set方法,然后进行赋值调用
1445+
* 但是因为这个已经不推荐了,所以还是推荐使用类似@Autowired的方式或者构造方式来进行属性赋值
1446+
*/
14081447
int resolvedAutowireMode = mbd.getResolvedAutowireMode();
14091448
if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
14101449
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
@@ -1419,14 +1458,21 @@ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable B
14191458
pvs = newPvs;
14201459
}
14211460

1461+
// 继续判断是否存在InstantiationAwareBeanPostProcessor的bean
14221462
boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
14231463
boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
14241464

14251465
PropertyDescriptor[] filteredPds = null;
1426-
if (hasInstAwareBpps) {
1466+
if (hasInstAwareBpps) { // 如果存在InstantiationAwareBeanPostProcessor的bean
1467+
// 这个pvs代表的是是否已经在我们的BeanDefinition里面提前给一些属性赋值了
1468+
// 比如我们的A bean里面的B属性,如果提前在PropertyValues里面设置了,则下面的@Autowired注解啊什么的,就不会再次去赋值了
1469+
// 提前设置PropertyValues可以在我们前面的MergedBeanDefinitionPostProcessor的时候,对BeanDefinition进行设置
14271470
if (pvs == null) {
14281471
pvs = mbd.getPropertyValues();
14291472
}
1473+
// 循环调用InstantiationAwareBeanPostProcessor里面的postProcessProperties方法
1474+
// 需要注意的是我们的@Autowired, @Resource @Inject就是在这个流程中实现的
1475+
// 所以这里主要是完成了我们Spring的一个依赖注入功能的地方
14301476
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
14311477
PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
14321478
if (pvsToUse == null) {
@@ -1448,7 +1494,7 @@ protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable B
14481494
checkDependencies(beanName, mbd, filteredPds, pvs);
14491495
}
14501496

1451-
if (pvs != null) {
1497+
if (pvs != null) { // 就是在这里把我们自定义的一些propertyValue设置到bean里面
14521498
applyPropertyValues(beanName, mbd, bw, pvs);
14531499
}
14541500
}
@@ -1788,15 +1834,26 @@ protected Object initializeBean(String beanName, Object bean, @Nullable RootBean
17881834
}, getAccessControlContext());
17891835
}
17901836
else {
1837+
// 调用一下aware的方法:BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
1838+
// 主要是beanNameAware,如果我们一个bean想要知道自己的beanName就通过实现BeanNameAware来拿到
17911839
invokeAwareMethods(beanName, bean);
17921840
}
17931841

17941842
Object wrappedBean = bean;
1843+
// 初始化之前调用我们BeanPostProcessor的before方法,可能会在里面改变我们的bean对象
1844+
/**
1845+
* 主要在意两个
1846+
* 一个是ApplicationContextAwareProcessor这个对象,用来实现我们各种aware回调的
1847+
* 比如我们想要获取ApplicationContext去实现ApplicationContextAware,就在这里回调的
1848+
* 第二个是InitDestroyAnnotationBeanPostProcessor这个,是用来处理我们@PostContrscut注解的
1849+
* 也就是我们在bean中使用的这个注解会在这里被调用
1850+
*/
17951851
if (mbd == null || !mbd.isSynthetic()) {
17961852
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
17971853
}
17981854

17991855
try {
1856+
// 调用初始化方法
18001857
invokeInitMethods(beanName, wrappedBean, mbd);
18011858
}
18021859
catch (Throwable ex) {
@@ -1805,6 +1862,7 @@ protected Object initializeBean(String beanName, Object bean, @Nullable RootBean
18051862
beanName, "Invocation of init method failed", ex);
18061863
}
18071864
if (mbd == null || !mbd.isSynthetic()) {
1865+
// 初始化之后调用我们BeanPostProcessor的after方法,AOP流程主要在这里实现
18081866
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
18091867
}
18101868

@@ -1843,6 +1901,7 @@ private void invokeAwareMethods(String beanName, Object bean) {
18431901
protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
18441902
throws Throwable {
18451903

1904+
// 如果我们的bean实现了InitializingBean,则调用它的afterPropertiesSet方法
18461905
boolean isInitializingBean = (bean instanceof InitializingBean);
18471906
if (isInitializingBean && (mbd == null || !mbd.hasAnyExternallyManagedInitMethod("afterPropertiesSet"))) {
18481907
if (logger.isTraceEnabled()) {
@@ -1864,6 +1923,7 @@ protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBea
18641923
}
18651924
}
18661925

1926+
// 如果我们的beanDefinition里面设置了initMethodName,则还会调用这个方法
18671927
if (mbd != null && bean.getClass() != NullBean.class) {
18681928
String initMethodName = mbd.getInitMethodName();
18691929
if (StringUtils.hasLength(initMethodName) &&

spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ public Class<?> resolveBeanClass(@Nullable ClassLoader classLoader) throws Class
466466
if (className == null) {
467467
return null;
468468
}
469+
// 通过className和classLoader去加载class
469470
Class<?> resolvedClass = ClassUtils.forName(className, classLoader);
470471
this.beanClass = resolvedClass;
471472
return resolvedClass;

0 commit comments

Comments
 (0)