Spring源码解析
Spring源码解析
ioc容器注入流程
ioc容器注入流程可以大致分为这几个步骤
概述
在spring中我们的配置文件可能有很多种类型,例如:
xml
、properties
、yml
、注解
;这些类型的配置文件解析出来的东西肯定是不一样的,所以我们应该让他们通过一个抽象层BeanDefinitionReader
,使其最终返回的结果都是BeanDefinition
类型。对于不同的类型我们可以通过抽象层的不同的子类来对其进行解析解析完成之后返回一个
BeanDefinition
对象,用于存储bean的定义信息。而这些BeanDefinition
对象则存储在Map
集合当中。之后通过BeanFactory
实例化具体的对象BeanFactory
bean工厂,用于访问一个 Spring bean 容器,相当于一个入口,也可以等同于容器PostProcessor
称为后置处理器,也称为增强器。个人认为称为增强器更适合。PostProcessor
有两个扩展分支,分别是BeanFactoryPostProcessor
和BeanPostProcessor
,其主要的作用就是定制化我们的spring,使其具有更多的功能,类似于扩展点BeanFactoryPostProcessor
针对BeanFactory
进行增强;BeanPostProcessor
针对Bean
进行增强;例如我们常见的数据源配置${JDBC.userName}
,我们对配置文件进行解析之后得到的仍然还是${JDBC.userName}
这个字符串,这时候就要用到BeanFactoryPostProcessor
的实现类PlaceholdConfigurerSupport
对其进行处理成我们想要的userName
我们可以在IOC容器里面的
BeanFactory
的标准初始化完成之后,修改IOC容器里面的这个BeanFactory
。也就是说,BeanFactoryPostProcessor
的调用时机是在BeanFactory
标准初始化之后,这样一来,我们就可以来定制和修改BeanFactory
里面的一些内容了。那什么叫标准初始化呢?它说的是所有的bean定义
已经被加载了,但是还没有bean
被初始化说人话,就是
BeanFactoryPostProcessor
的调用时机是在BeanFactory
标准初始化之后,这样一来,我们就可以来定制和修改BeanFactory
里面的一些内容,此时,所有的bean定义
已经保存加载到BeanFactory
中了,但是bean
的实例还未创建我们也可以自己创建一个类,实现
BeanFactoryPostProcessor
接口观察其什么时候被调用当
BeanFactory
加载BeanDefinition
到Map
之中后就该通过反射去创建一个对象了。先通过反射实例化一个对象,之后进行初始化初始化则遵从下图的几个步骤,调用完
Aware
接口之后就该调用各种BeanPostProcessor
的实现类了,我们熟知的AOP
就是实现了BeanPostProcessor
接口先调用
BeanPostProcessor
实现类的postProcessBeforeInitialization()
方法,然后调用对象本身的构造方法,最后调用BeanPostProcessor
实现类的postProcessAfterInitialization()
方法
源码
继承关系 |
---|
AbstractApplicationContext |
AbstractRefreshableApplicationContext |
AbstractRefreshableConfigApplicationContext |
AbstractXmlApplicationContext |
ClassPathXmlApplicationContext |
结合源码来观察注入的流程,以下面获得容器的方式为例
1 | ApplicationContext applicationContext = |
上述代码会调用ClassPathXmlApplicationContext
的有参构造器
1 | public ClassPathXmlApplicationContext(String configLocation) throws BeansException { |
这个构造器调用有三个参数的构造器
1 | public ClassPathXmlApplicationContext( |
至此,我们找到了自动注入中最重要的方法之一refresh()
,而这个方法是从一个抽象类AbstractApplicationContext
中继承来的,我们进入这个抽象方法中查看其源码
1 |
|
我们可以看到创建容器和创建对象都是在这个方法中实现的
refreshBeanFactory()
方法在其实现类AbstractRefreshableApplicationContext
中被重写,负责创建容器,并读取解析xml文件成一个个BeanDefinition
对象,之后放到DefaultListableBeanFactory
中的beanDefinitionMap
和beanDefinitionName
集合中1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
protected final void refreshBeanFactory() throws BeansException {
// 判断是否有BeanFactory
if (hasBeanFactory()) {
// 如果有则销毁并关闭
destroyBeans();
closeBeanFactory();
}
try {
// 创建 DefaultListableBeanFactory
DefaultListableBeanFactory beanFactory = createBeanFactory();
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
// xml文件读取并解析
// 解析完成后将BeanDefinition对象放到DefaultListableBeanFactory中的beanDefinitionMap和beanDefinitionName中
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
}
catch (IOException ex) {
throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
}
}调用各种
BeanFactoryPostProcessor
的实现类是在invokeBeanFactoryPostProcessors()
方法中实现finishBeanFactoryInitialization()
方法中调用了DefaultListableBeanFactory
容器的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
54
55
56
57
58
59
60
61
62
63
64
65
66
public void preInstantiateSingletons() throws BeansException {
if (logger.isTraceEnabled()) {
logger.trace("Pre-instantiating singletons in " + this);
}
// Iterate over a copy to allow for init methods which in turn register new bean definitions.
// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
// 为所有bean的名字创建一个List集合
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// Trigger initialization of all non-lazy singleton beans...
// 触发所有非延迟加载单例bean的初始化,遍历集合的对象
for (String beanName : beanNames) {
// 合并父类BeanDefinition
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
//条件判断以下都是一些判断,getBean方法才去实例化
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 判断是否实现FactoryBean
if (isFactoryBean(beanName)) {
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
// 进行类型转换
if (bean instanceof FactoryBean) {
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 {
// 如果beanName对应的bean不是FactoryBean,而是普通的bean,则通过beanName获取bean实例
getBean(beanName);
}
}
}
// Trigger post-initialization callback for all applicable beans...
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
if (singletonInstance instanceof SmartInitializingSingleton) {
StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize")
.tag("beanName", beanName);
SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
smartSingleton.afterSingletonsInstantiated();
return null;
}, getAccessControlContext());
}
else {
smartSingleton.afterSingletonsInstantiated();
}
smartInitialize.end();
}
}
}getBean(beanName)
是DefaultListableBeanFactory
从父类AbstractBeanFactory
继承的方法,其中又调用了doGetBean()
方法,其中有一段代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// Create bean instance.
// 创建bean实例
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// Explicitly remove instance from singleton cache: It might have been put there
// eagerly by the creation process, to allow for circular reference resolution.
// Also remove any beans that received a temporary reference to the bean.
destroySingleton(beanName);
throw ex;
}
});
beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}抽象方法
createBean()
即是要创建bean实例的方法进入子类重写的
createBean()
方法中,其中有一段代码1
2
3
4
5
6
7
8try {
// 实际创建bean的方法
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isTraceEnabled()) {
logger.trace("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}doCreateBean()
就是实际创建bean实例的方法了进入
doCreateBean()
方法中,有一段代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// Instantiate the bean.
// BeanWrapper用来持有创建出来的bean对象
BeanWrapper instanceWrapper = null;
// 获取factoryBean实例缓存
if (mbd.isSingleton()) {
// 如果是单例对象,从factorybean实例缓存中移除当前bean定义信息
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
// 如果没有就创建实例
if (instanceWrapper == null) {
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}createBeanInstance()
就是返回实例的方法再进入
createBeanInstance()
中,有一段代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// Candidate constructors for autowiring?
// 从bean后置处理器中为自动装配寻找构造方法,有且仅有一个有参构造或者有且仅有@Autowired注解构造
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
//满足
// 存在可选构造方法
// 自动装配模型为构造函数自动装配
// 给BeanDefinition中设置了构造参数值
// 有参与构造函数参数列表的参数
//之一就进入if语句块
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
// Preferred constructors for default construction?
ctors = mbd.getPreferredConstructors();
if (ctors != null) {
return autowireConstructor(beanName, mbd, ctors, null);
}
// No special handling: simply use no-arg constructor.
return instantiateBean(beanName, mbd);再进入
instantiateBean()
中,有一段代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20protected BeanWrapper instantiateBean(String beanName, RootBeanDefinition mbd) {
try {
Object beanInstance;
if (System.getSecurityManager() != null) {
beanInstance = AccessController.doPrivileged(
(PrivilegedAction<Object>) () -> getInstantiationStrategy().instantiate(mbd, beanName, this),
getAccessControlContext());
}
else {
beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, this);
}
BeanWrapper bw = new BeanWrapperImpl(beanInstance);
initBeanWrapper(bw);
return bw;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);
}
}再进入
instantiate()
中,其中有一段代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17try {
if (System.getSecurityManager() != null) {
constructorToUse = AccessController.doPrivileged(
(PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);
}
else {
//获取默认的无参构造器
constructorToUse = clazz.getDeclaredConstructor();
}
bd.resolvedConstructorOrFactoryMethod = constructorToUse;
}
catch (Throwable ex) {
throw new BeanInstantiationException(clazz, "No default constructor found", ex);
}
}
}
return BeanUtils.instantiateClass(constructorToUse);我们终于可以看到我们熟悉的反射代码
constructorToUse = clazz.getDeclaredConstructor()
,通过这段代码获取了构造器,并在最后通过BeanUtils.instantiateClass(constructorToUse)
最终实例化对象进入
BeanUtils.instantiateClass()
中
1 | try { |
ctor.newInstance(argsWithDefaultValues)
通过反射的方式创建实例
最终将创建完成的bean实例返回到
doCreateBean()
方法中,doCreateBean()
方法往下走到下面这段代码时候,对实例化的对象进行初始化1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// Initialize the bean instance.
Object exposedObject = bean;
try {
populateBean(beanName, mbd, instanceWrapper);
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
catch (Throwable ex) {
if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
throw (BeanCreationException) ex;
}
else {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
}
}populateBean()
方法就用于填充bean实例initializeBean()
方法用于初始化bean实例进入
initializeBean()
方法中,我们可以看到invokeAwareMethods
:调用Aware接口的实现类applyBeanPostProcessorsBeforeInitialization()
:调用BeanPostProcessor
的前置方法applyBeanPostProcessorsAfterInitialization()
:调用BeanPostProcessor
的后置方法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
30protected Object initializeBean(String beanName, Object bean, { RootBeanDefinition mbd)
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 {
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;
}