工程准备
引入Spring最小依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.1.8.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>applicationContext.xml配置
1 |
|
- Spring 启动代码
1 | package org.ting.spring.study; |
了解ClassPathXmlApplicationContext
这个类基本上都是构造函数
可以看出,这个没有任何业务逻辑代码,都是通过继承抽象类扩展功能,主要业务都在父类中。下面我们看下构造方法是怎么初始化Spring容器的
1 | public ClassPathXmlApplicationContext(String configLocation) throws BeansException { |
进入this构造方法
1 | public ClassPathXmlApplicationContext( |
可以看出,这个才是ClassPathXmlApplicatonContext实例化方法,设置父容器对象,添加配置文件路径到容器中,开始启动容器工作。super(parent)
方法依次调用服务父类AbstractXmlApplicationContext
、AbstractRefreshableConfigApplicationContext
、AbstractRefreshableApplicationContext
、AbstractApplicationContext
的构造方法。
1 | public AbstractApplicationContext(@Nullable ApplicationContext parent) { |
这个方法主要是向上调用父类构造方法,一直到AbstractApplicationContext对象。参数不为空的话将父上下文对像Environment
设置合并到当前容器中,将两个容器配置文件合并起来,一般在web环境有使用到。
setConfigLocations
1 | public void setConfigLocations(@Nullable String... locations) { |
将路径添加到AbstractRefreshableConfigApplicationContext
configLocations 属性中,并且出来掉路径中环境变量占位符,保证configLocaiton得到是可用地址。
refresh解读
1 |
|
下面我们一个个方法解析
prepareRefresh
1 | protected void prepareRefresh() { |
设置启动时间,将关闭标记设置false,活动开关设置true,initPropertySources(),本身是一个空方法,由子类自行去实现,让子类在容器创建之前修改ConfigurableEnvironment
的PropertySources
对象属性。PropertySources
name/value键值对的封装接口,主要用来装配配置变量。虽然ClassPathXmlApplicatonContext
和他的父类都没有实现这个方法,在Spring MVC中, GenericWebApplicationContext
实现initPropertySources方法,将servletContext
配置变量合并到ProertySources
中。接着看getEnvironment().validateRequiredProperties()这个方法实现在
validateRequiredProperties
1 |
|
主要校验ProertySources
中key value,是否有不对应的情况。其实这个主要校验上一个initPropertySources()方法安全措施来的。比如老爸放手让自己儿子去做一件事,自己完全不干预,但是他会偷偷去查看事件做得怎么样?如果做不不行,狠狠打儿子一顿。
ConfigurableListableBeanFactory初始化
这部分应该是整个代码解析最核心的功能了,这个类就是我们经常说的Spring容器,Spring工厂的实现DefaultListableBeanFactory
。主要负责bean注册实例化,bean查找,bean别名,bean销毁。这里实例化这个对象,也开始说明Spring生命周期正式开始。下面是 DefaultListableBeanFactory的继承关系
查看obtainFreshBeanFactory方法具体内容
1 | protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { |
refreshBeanFactory主要是清除ConfigurableListableBeanFactory bean缓存,重新实例化。
refreshBeanFactory
这个方法在AbstractRefreshableApplicationContext
中
1 | protected final void refreshBeanFactory() throws BeansException { |
先判断ConfigurableListableBeanFactory对象是否已经创建成功了,如果已经存在了,执行销毁Spring容器内已经注册bean销毁,重新实例化ConfigurableListableBeanFactory对象,设置id,设置beanFactory bean重名,依赖解决方式。开始加载xml配置文件,注册BeanDefinition,将已经实例化BeanFactory指引再指向this.beanFactory。
主要看下destroyBeans()
1 | protected void destroyBeans() { |
调用了ConfigurableListableBeanFactory的destroySingletons方法,接口的实现类是DefaultListableBeanFactory
。
1 |
|
destroySingletons
super.destroySingletons()调用了DefaultSingletonBeanRegistry
的destroySingletons
方法
1 | public void destroySingletons() { |
destroySingleton
1 | public void destroySingleton(String beanName) { |
查看removeSingleton方法
1 | protected void removeSingleton(String beanName) { |
这几个分别就是内部容器来的,看下主要用途
1 | /**缓存单例bean对象 : beanName 对应 bean对象 */ |
destroyBean
1 | protected void destroyBean(String beanName, @Nullable DisposableBean bean) { |
在删除DisposableBean实例的时候,获取bean下依赖实例,逐个移除。最后将Spring容器依赖实体逐个移除。接着看closeBeanFactory()
办法
loadBeanDefinitions 解析
1 |
|
实例化XmlBeanDefinitionReader
将资源文件xml解析成BeanDefinition,将Spring上下文对象赋值给对象属性。loadBeanDefinitions会将xml文件转化成Document
对象,由于这部分太过繁琐,需要根据文件名获取ResouceLoader,再获取到文件流对象,解析xml成Document,觉得省略这些代码解析,主要放在Document如何转化成BeanDefinition
,在DefaultBeanDefinitionDocumentReader
实现。
doRegisterBeanDefinitions
1 | protected void doRegisterBeanDefinitions(Element root) { |
BeanDefinitionParserDelegate
主要是解析Document命名空间,标签元素,属性,将xml标签转化成对象。
prseBeanDefinitions
1 | protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { |
循环遍历beans
的子标签,符合”import”, “alias”, “bean”命名空间,进入标签解析环节
1 | private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { |
主要看下bean标签解析
1 | protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { |
这个方法将xml解析返回 BeanDefinition对象,如果对象不为空,继续解析元素的自定义属性,并将元素自定义属性设置给刚刚创建BeanDefiniton对象,最后广播注册BeanDefinition对象。关于如何生成BeanDefiniton对象,这个方法我不具体深入了解了,毕竟里面篇幅很多的,以后会专门出一个章节去说明。
prepareBeanFactory 方法解析
prepareBeanFactory方法主要是配置BeanFactory 类加载器,Spring el表达式实现,bean前置处理器等等的属性设置,主要逻辑详看下面的代码
1 | protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { |
BeanPostProcessor
addBeanPostProcessor方法主要添加BeanPostProcessor接口实现类,Bean 的后置处理器,主要是在 bean 初始化前后进行一些处理工作,spring bean 创建委派给个大后置处理器创建。
1 | public interface BeanPostProcessor { |
ApplicationContextAwareProcessor
1 |
|
上面的逻辑非常判断准备初始化bean是否实现了EnvironmentAware
,EmbeddedValueResolverAware
,ResourceLoaderAware
,ApplicationEventPublisherAware
,MessageSourceAware
.ApplicationContextAware
接口,如果是,直接执行接口方法,将Spring工厂方法注入属性中。这个也解析了上面设置registerResolvableDependency
依赖注入忽略。
postProcessBeanFactory
postProcessBeanFactory方法中没有任何实现,主要是允许子类在Spring工厂还没有初始化bean之前,添加一些特殊bean进入到容器中,比如添加BeanPostProcessors接口实现类。这时候Spring 已经解析完xml,还需要想添加一些bean到容器中,这时候就可以实现这个方法。
invokeBeanFactoryPostProcessors
BeanFactoryPostProcessors接口跟BeanPostProcessor类似,可以用于bean的定义进行处理,也可以在bean初始化之前修改bean元数据。可以配置多个BeanFactoryPostProcessor,使用Order接口来控制执行顺序。源码展示
1 | protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { |
invokeBeanFactoryPostProcessors
1 | public static void invokeBeanFactoryPostProcessors( |
看起来代码挺多,其实很简单的逻辑。
- 遍历循环所有
BeanFactoryPostProcessor
集合,首先取出BeanDefinitionRegistryPostProcessor
,并且执行接口方法,再放入registryProcessors容器中。 - BeanFactory 中获取所有
BeanDefinitionRegistryPostProcessor
类型的bean name 数组,遍历循环数据,判断是否有PriorityOrdered
接口,加入容器中,并且根据接口重新排序后,遍历容器所有类,执行接口方法,加入registryProcessors容器中。 - 在获取容器所有
BeanDefinitionRegistryPostProcessor
类型的bean name 数组,循环遍历bean name 取出实现Ordered
接口,按照Orderd
顺序排序集合,依次执行接口方法,加入放入registryProcessors容器中. - 将剩下所有BeanDefinitionRegistryPostProcessor,加入registryProcessors容器中。执行registryProcessors容器中所有
BeanFactoryPostProcessor
的接口方法。 BeanFactoryPostProcessor
也是按照上面的思路,先过滤排序执行接口方法。
看到这里我有一个疑问,这些接口对象怎么产生的?Spring 工厂并没有开始实例化对象,这时候Spring只进行到将xml转化成beanDefinition这个对象,不可能从Spring 工厂获取出来的。BeanFactoryPostProcessor实例化过程
实例化bean 的方法主要在AbstractBeanFactory
中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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
// 取出&提取对应beanName
final String beanName = transformedBeanName(name);
Object bean;
// 在缓存中获取对象
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
if (logger.isTraceEnabled()) {
if (isSingletonCurrentlyInCreation(beanName)) {
logger.trace("Returning eagerly cached instance of singleton bean '" + beanName +
"' that is not fully initialized yet - a consequence of a circular reference");
}
else {
logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
}
}
//判断缓存中对象是否是正确的bean实例化,如果是FactoryBean接口对象,调用接口方法获取到bean实例
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
// 如果beanName 是prototpe或者scope类型,并且正在创建中,直接抛出异常
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// 尝试在父容器获取
BeanFactory parentBeanFactory = getParentBeanFactory();
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
// 没有找到,尝试修改beanName名称,重新来过
String nameToLookup = originalBeanName(name);
if (parentBeanFactory instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);
}
else if (args != null) {
// Delegation to parent with explicit args.
return (T) parentBeanFactory.getBean(nameToLookup, args);
}
else if (requiredType != null) {
// No args -> delegate to standard getBean method.
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
else {
return (T) parentBeanFactory.getBean(nameToLookup);
}
}
//如果只是做类型检查,不进行实例化,这将bean加入创建记录中
if (!typeCheckOnly) {
markBeanAsCreated(beanName);
}
try {
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
//判断BeanDefinition 类型不是抽象类
checkMergedBeanDefinition(mbd, beanName, args);
// 获取bean 元数据所有依赖bean
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
if (isDependent(beanName, dep)) { //检查是否存在依赖关系
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
}
//相互添加依赖和被依赖的关联
registerDependentBean(dep, beanName);
try {
getBean(dep); //实例化创建依赖bean
}
catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
}
}
}
// 创建单例对象
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
//具体创建bean方法,由子类 AbstractAutowireCapableBeanFactory实现
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
else if (mbd.isPrototype()) {
// It's a prototype -> create a new instance.
Object prototypeInstance = null;
try {
//添加创建记录
beforePrototypeCreation(beanName);
prototypeInstance = createBean(beanName, mbd, args);
}
finally {
//删除记录
afterPrototypeCreation(beanName);
}
bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
}
else {
String scopeName = mbd.getScope();
final Scope scope = this.scopes.get(scopeName);
if (scope == null) {
throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
}
try {
Object scopedInstance = scope.get(beanName, () -> {
beforePrototypeCreation(beanName);
try {
return createBean(beanName, mbd, args);
}
finally {
afterPrototypeCreation(beanName);
}
});
bean = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
}
catch (IllegalStateException ex) {
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",
ex);
}
}
}
catch (BeansException ex) {
cleanupAfterBeanCreationFailure(beanName);
throw ex;
}
}
// 类型检查 得到bean可能是String类型,但是需要转化成Integer类型
if (requiredType != null && !requiredType.isInstance(bean)) {
try {
//使用类型转化器
T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
if (convertedBean == null) {
throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
}
return convertedBean;
}
catch (TypeMismatchException ex) {
if (logger.isTraceEnabled()) {
logger.trace("Failed to convert bean '" + name + "' to required type '" +
ClassUtils.getQualifiedName(requiredType) + "'", ex);
}
throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
}
}
return (T) bean;
}
这个就是Spring 创建bean具体流程,但是任然还有很多细节没有表达出来,看了这么多源码,都知道一个方法不可能放得下这么多逻辑的。以后有机会我入深入每个方法再具体讲解的。主要总结下Spring 创建bean整体路程。
- 处理beanName,去除FactoryBean的修饰符,也就是”&name” 转化成”name”。将alias name 转化成真正beanName。
- 如果是否是单例,尝试从缓存中加载bean。再处理缓存中bean,在缓存中记录的只是最原始bean,并一定是我们最终想要的bean,需要getObjectForBeanInstance來完成這個工作。
- 原型依赖检查
- 尝试从父容器中获取bean,如果父容器不为空并且包含beanName情况下。
- 获取beanName下所有的依赖bean,并且实例化所有的依赖bean
- 根据对象scope 分别实例化bean。
- 实例化结束后,将对象转化成requiredType 给定类型。
registerBeanPostProcessors
注册所有BeanPostProcessor
后置处理类,这里只是注册,不会执行任何接口方法。具体流程跟上面BeanFactoryPostProcessor
非常相似。在PostProcessorRegistrationDelegate
看下具体代码逻辑,注意与上面代码相似地方。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
71public static void registerBeanPostProcessors(
ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
//根据类型获取所有BeanPostProcessor beanName
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
// 注册 BeanPostProcessorChecker 只是一个info 日志信息打印类
// 当一个bean 正在被BeanPostProcessor 创建时就会打印信息
// 这个bean不能是BeanPostProcessor类型
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// 使用PriorityOrdered 排序bean 执行顺序
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
//MergedBeanDefinitionPostProcessor 接口容器
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
//使用Ordered 接口排序bean 执行顺序
List<String> orderedPostProcessorNames = new ArrayList<>();
// 默认顺序排序
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) { //匹配类型
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
priorityOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
//首先注册PriorityOrdered 优先排序
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
//只是注册处理器,不调用方法
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 接着注册Ordered 类型 优先排序
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String ppName : orderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
orderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
sortPostProcessors(orderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, orderedPostProcessors);
// 注册所有常规 BeanPostProcessors.
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// 最后注册 MergedBeanDefinitionPostProcessor 类型
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// 注册ApplicationListener 后置处理器
// 添加到所有处理器链后面
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
BeanPostProcessor
注册流程跟上面BeanFactoryPostProcessor
非常相似啊。
- 根据
BeanPostProcessor
获取所有后置处理器beanName - 根据beanName数组长度创建
BeanPostProcessorChecker
对象,并注册到容器中。 - 根据PriorityOrdered,MergedBeanDefinitionPostProcessor,Ordered,等类型分别创建不同处理器容器
- 根据不同类型排序注册处理器
initMessageSource
初始化信息资源类,Spring内部国际化支持。逻辑非常简单,先判断容器内是否有messageSource
,直接注册bean,否则Spring内部注册DelegatingMessageSource
。代码我就不放出来了,有兴趣同学自行去查看。initApplicationEventMulticaster
初始化ApplicationEventMulticaster
事件组播器,主要判断用户是否自定义了事件组播器,直接使用用户定义的组播器。如果没有用户自定义组播器,默认使用SimpleApplicationEventMulticaster
,代码略…onRefresh
初始化其他特殊bean,由子类自行实现。这里又是使用了模板方法设计模式,让使用者可以扩展新功能。registerListeners
注册所有实现ApplicationListeners接口的监听器,添加到上面刚刚初始化组播器中。获取所有事件集合,发布到组播器中,组播器再广播到监听指定事件的监听器中。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22protected void registerListeners() {
// Register statically specified listeners first.
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
// Do not initialize FactoryBeans here: We need to leave all regular beans
// uninitialized to let post-processors apply to them!
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// Publish early application events now that we finally have a multicaster...
Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
this.earlyApplicationEvents = null;
if (earlyEventsToProcess != null) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
finishBeanFactoryInitialization
这个方法就是我们解析Spring IOC核心了,初始化所有Spring bean,看这么多代码,终于到了我们最想了解部分了,直接上代码
1 | protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) { |
- 判断容器内是否有
conversionService
,并且类型必须是 ConversionService,则实例化bean。ConversionService接口也是个类型转换器。 - 判断容器内是否有
StringValueResolver
类型bean,没有手动注册一个。 - 初始化所有AOP 通知类型。
- 冻结所有bean元数据特性,不允许任何修改。
- 实例化所有非延迟单例bean
preInstantiateSingletons
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
54public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
// 遍历所有beanDefinitionNames,copy 到信息list中
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// 实例化所有非延迟bean
for (String beanName : beanNames) {
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
if (isFactoryBean(beanName)) {// 判断FactoryBean 接口类型bean
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
if (bean instanceof FactoryBean) {
final FactoryBean<?> factory = (FactoryBean<?>) bean;
boolean isEagerInit;
if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)
((SmartFactoryBean<?>) factory)::isEagerInit,
getAccessControlContext());
}
else {
isEagerInit = (factory instanceof SmartFactoryBean &&
((SmartFactoryBean<?>) factory).isEagerInit());
}
if (isEagerInit) {
getBean(beanName);
}
}
}
else {
getBean(beanName);
}
}
}
// 执行bean中实现SmartInitializingSingleton接口,执行接口方法,用与单例bean 初始化成功后执行
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
}
}
}
finishRefresh
1 | protected void finishRefresh() { |
到这里说明Spring 创建bean过程差不多完成了,但是还有很多细节没有展示出来,因为篇幅实在太多了。可以看出我前面讲得还是比较详细的,到了后面简略一些方法解析,篇幅实在太长了。如果有哪里说错了,或者讲得不好,请指出来,大家一起学习讨论下。