我是靠谱客的博主 愤怒芒果,这篇文章主要介绍Spring DI源码跟踪小记,现在分享给大家,希望可以做个参考。

  • 1、开始 AbstractBeanFactory.getBean()
复制代码
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
public Object getBean(String name) throws BeansException { return this.doGetBean(name, (Class)null, (Object[])null, false); } protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName = this.transformedBeanName(name); Object sharedInstance = this.getSingleton(beanName); Object bean; if (sharedInstance != null && args == null) { // ... ... } else { // ... ... // ... ... if (mbd.isSingleton()) { sharedInstance = this.getSingleton(beanName, new ObjectFactory<Object>() { public Object getObject() throws BeansException { try { // 创建bean return AbstractBeanFactory.this.createBean(beanName, mbd, args); } catch (BeansException var2) { AbstractBeanFactory.this.destroySingleton(beanName); throw var2; } } }); bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd); } else if (mbd.isPrototype()) { // ... ... } else { // ... ... } catch (IllegalStateException var20) { throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; " + "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var20); } } } if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) { // ... ... } else { return bean; } }
  • 2、AbstractAutowireCapableBeanFactory#createBean()
复制代码
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException { // ... ... Object beanInstance; // ... ... beanInstance = this.doCreateBean(beanName, mbd, args); // ... ... return beanInstance; } protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) { BeanWrapper instanceWrapper = null; if (mbd.isSingleton()) { instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName); } if (instanceWrapper == null) { // 返回Bean包装器 instanceWrapper = this.createBeanInstance(beanName, mbd, args); } // ... ... Object exposedObject = bean; try { // 根据Bean包装器填充Bean实例 this.populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { // 初始化bean exposedObject = this.initializeBean(beanName, exposedObject, mbd); } } catch (Throwable var17) { // ... ... } // ... ... try { this.registerDisposableBeanIfNecessary(beanName, bean, mbd); return exposedObject; } catch (BeanDefinitionValidationException var16) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16); } } protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) { Class beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]); if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) { // ... ... } else if (mbd.getFactoryMethodName() != null) { return this.instantiateUsingFactoryMethod(beanName, mbd, args); } else { // 实例化Bean if (resolved) { return autowireNecessary ? this.autowireConstructor(beanName, mbd, (Constructor[])null, (Object[])null) : this.instantiateBean(beanName, mbd); } else { Constructor[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName); return ctors == null && mbd.getResolvedAutowireMode() != 3 && !mbd.hasConstructorArgumentValues() && ObjectUtils.isEmpty(args) ? this.instantiateBean(beanName, mbd) : this.autowireConstructor(beanName, mbd, ctors, args); } } } protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) { try { Object beanInstance; // 实例化Bean if (System.getSecurityManager() != null) { beanInstance = AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { return AbstractAutowireCapableBeanFactory.this.getInstantiationStrategy().instantiate(mbd, beanName, AbstractAutowireCapableBeanFactory.this); } }, this.getAccessControlContext()); } else { beanInstance = this.getInstantiationStrategy().instantiate(mbd, beanName, this); } // 返回Bean包装器 BeanWrapper bw = new BeanWrapperImpl(beanInstance); this.initBeanWrapper(bw); return bw; } catch (Throwable var6) { throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", var6); } }

总结:
1、调用 AbstractBeanFactory获取Bean
2、跳到 AbstractAutowireCapableBeanFactory.createBean()
3、调用 createBeanInstance 创建Bean包装器 BeanWrapper
4、再使用BeanWrapper填充Bean
5、再使用initializeBean 初始化Bean 然后返回

最后

以上就是愤怒芒果最近收集整理的关于Spring DI源码跟踪小记的全部内容,更多相关Spring内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部