bean实例化
过程。整个正常流程是遍历bean工厂存放beanName的list, 并根据beanName拿到对应的beanDefinition,只过滤掉非抽象
、单例
、非懒加载
的beand进行创建
因为spring存在两种bean, 普通bean和FactoryBean,spring在区分这两种bean的做法是beanName和beanType来双重校验的。假设获取的bean为FactoryBean,那么会在getBean之前在beanName前添加一个&
符号
if (isFactoryBean(beanName)) {
// org.springframework.beans.factory.BeanFactory#FACTORY_BEAN_PREFIX
// String FACTORY_BEAN_PREFIX = "&";
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
// 后面的逻辑省略
}
&
符号去掉并存入内部自己维护的一个变量中), 此时关于当前bean的名称会有两个变量存储,分别是name(方法传入的bean名称), beanName(处理过bean名称)getObjectForBeanInstance
方法来返回bean。这样做主要是为了处理获取的bean类型为FactoryBean的情况。public Object getSingleton(String beanName)
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory)
标记bean正在被创建:
此动作很重要, 主要是将beanName存放至DefaultSingletonBeanRegistry类的singletonsCurrentlyInCreation数据结构(Set), 后续会根据这个依据来解决循环依赖的情况, 即上述1.2.4 第一次getSingleon中所说的获取不为null的情况protected void beforeSingletonCreation(String beanName) {
if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.add(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
}
确定当前bean是否通过构造方法自动装配, 源码和条件如下:
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
1. ctors != null => ctors中存的是构造方法中添加@Autowired注解的情形
2. mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR => 此条件为使用后置处理器手动修改beanDefinition的自动装配的值, 默认为no
3. mbd.hasConstructorArgumentValues()
=> 使用后置处理器手动添加beanDefinition中存放构造方法值的情形,
eg: mybatis中的definition.getConstructorArgumentValues().addGenericArgumentValue(definition.getBeanClassName());
4. !ObjectUtils.isEmpty(args)
上述条件只要满足一个就走构造方法自动装配的逻辑
```
若使用构造方法自动装配的结论不成立则走默认构造方法创建bean流程
不管是默认构造方法创建bean还是通过构造方法自动装配bean,所有bean的创建使用的都是CglibSubclassingInstantiationStrategy策略
protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(singletonFactory, "Singleton factory must not be null");
synchronized (this.singletonObjects) {
if (!this.singletonObjects.containsKey(beanName)) {
// 存放bean对应的ObjectFactory, 在bean的循环依赖中会用上
this.singletonFactories.put(beanName, singletonFactory);
this.earlySingletonObjects.remove(beanName);
// 存放已经被注册过的bean
this.registeredSingletons.add(beanName);
}
}
}
this.singletonFactories.put(beanName, singletonFactory);
=> 在getBean方法的第一次getSingleton中会用到,其实这个singletonFactory的形参中已经在创建bean的过程中传入了,并且内部的逻辑是执行SmartInstantiationAwareBeanPostProcessor后置处理器的getEarlyBeanReference方法,此方法可以返回一个bean
)的地方去拿bean
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName); => 此步骤只是为了记录这个bean已经被spring创建了或者正在被创建中
所以创建一个bean后(还未依赖注入bean), 会在singletonFactories和registeredSingletons数据结构中都存在相关记录
AutowiredAnnotationBeanPostProcessor
后置处理器来实现自动装配,若bean需要自动装配,则还需要先实例化依赖的bean,最终又会走到上述getBean逻辑BeanPostProcessor
后置处理器postProcessBeforeInitialization方法InitializingBean
接口, 则调用接口中的方法afterPropertiesSetBeanPostProcessor
后置处理器de postProcessAfterInitialization方法 // this.singletonsCurrentlyInCreation.remove(beanName) => 移除当前bean name
protected void afterSingletonCreation(String beanName) {
if (!this.inCreationCheckExclusions.contains(beanName) && !this.singletonsCurrentlyInCreation.remove(beanName)) {
throw new IllegalStateException("Singleton '" + beanName + "' isn't currently in creation");
}
}
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
// bean工厂单例池
this.singletonObjects.put(beanName, singletonObject);
// 执行到这表示当前bean已经创建完成, 则移除循环依赖的bean的情况,
// 若下次还有bean依赖它, 直接从bean工厂的单例池获取即可
this.singletonFactories.remove(beanName);
// 当前bean被创建完毕,则清除它
this.earlySingletonObjects.remove(beanName);
// 再次将bean添加至该集合中, 该集合是一个set, 不会重复, 这里重复添加的原因可能是并发情况
this.registeredSingletons.add(beanName);
}
}
将bean name添加至registeredSingletons以及将bean对应的ObjectFactory添加至singletonFactories。即上述的addSingletonFactory方法的操作
)和填充属性, 发现它依赖于B, 此时要去getBean(b)将bean name添加至registeredSingletons以及将bean对应的ObjectFactory添加至singletonFactories。即上述的addSingletonFactory方法的操作
)发现单例池中无a(虽然a在上述过程中被创建了, 但是它还未放入单例池中)但是它是处于被创建的状态, 所以从singletonFactories中根据beanName拿ObjectFactory, 最终从ObjectFactory拿到Bean a
, 并将singletonFactories中beanName对应的objectFactory remove掉,以及将拿到的bean a放入到earlySingletonObjects中registeredSingletons
: 表示该bean已经通过构造方法创建出来了singletonFactories
: 存放bean对应的objectFactory方法, 循环依赖时需要根据它来拿beanearlySingletonObjects
: 与singletonFactories的操作是互斥的, 里面存放的是singletonFactories中beanName对应的objectFactory创建出来的bean,若一个beanName在该集合中存在, 那么该bean对应的ObjectFactory就会在singletonFactories中被remove掉singletonsCurrentlyInCreation
: 表示当前bean正在被创建, 在getSingleton(String beanName, ObjectFactory> singletonFactory)方法中进行操作, 添加、移除正在创建的标识都是在此方法中完成执行顺序 | 执行位置 | 执行到的后置处理器 | 执行的方法 | 作用 |
---|---|---|---|---|
1 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.doCreateBean => resolveBeforeInstantiation方法 |
InstantiationAwareBeanPostProcessor | 1. postProcessBeforeInstantiation 2.postProcessAfterInitialization |
1. postProcessBeforeInstantiation作用: 若后置处理器中返回了一个对象, 则不会走spring的创建bean的流程 2.若postProcessBeforeInstantiation方法返回的bean不为null则执行postProcessAfterInitialization方法,该方法执行了BeanPostProcessor后置处理器, 自动装配的后置处理器就间接实现了BeanPostProcessor, 若BeanPostProcessor不被执行, 那么自动装配的功能也将缺失 3. 若bean中实现了aware接口,那么将按照aware的类型诶个执行对应的方法,其中就包括获取spring上下文的ApplicationContextAware |
2 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.createBeanInstance => determineConstructorsFromBeanPostProcessors |
SmartInstantiationAwareBeanPostProcessor | determineCandidateConstructors | 扫描当前bean携带@Autowired注解的构造方法或者只有一个带参的构造方法或者等等其他的情况。(具体参考AutowiredAnnotationBeanPostProcessor类的determineCandidateConstructors方法) |
3 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.doCreateBean => applyMergedBeanDefinitionPostProcessors |
MergedBeanDefinitionPostProcessor | postProcessMergedBeanDefinition | 将当前类需要自动装配的属性全部InjectionMetadata对象中(每个属性对应一个InjectionMetadata对象) |
4 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.doCreateBean => getEarlyBeanReference |
SmartInstantiationAwareBeanPostProcessor | getEarlyBeanReference | 当处理循环依赖时,会获取到状态为’正在创建’的bean的引用 |
5 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.populateBean => postProcessAfterInstantiation |
InstantiationAwareBeanPostProcessor | postProcessAfterInstantiation | 能够控制当前bean是否继续完成依赖注入逻辑,若方法return false,则当前bean的@Autowired注解功能的依赖注入结束 |
6 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.populateBean => postProcessPropertyValues |
InstantiationAwareBeanPostProcessor | postProcessPropertyValues | 处理当前bean自动装配的属性 |
7 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.initializeBean => applyBeanPostProcessorsBeforeInitialization |
BeanPostProcessor | postProcessBeforeInitialization | 当bean被实例化并完成自动装配之后执行 |
8 | org.springframework.beans.factory.support. AbstractAutowireCapableBeanFactory.initializeBean => applyBeanPostProcessorsAfterInitialization |
BeanPostProcessor | postProcessAfterInitialization | 当bean被实例化并完成自动装配之后执行,比postProcessBeforeInitialization方法后执行 |
BeanPostProcessor
, 并扩展了三个方法postProcessBeforeInstantiation、 postProcessAfterInstantiation和postProcessPropertyValues