Spring使用方式
我们使用Spring的时候,一般需要依赖于一个ApplicationContext实现类,我们分别从xml和注解两种方式介绍以下。
注意:这里不讨论使用tomcat等的web项目,我们只讨论普通java项目。无论哪种方式,每个实现类都有很多不同入参的构造方法,我们可以根据需要选择需要的构造方法。
xml方式
示例类:ClassPathXmlApplicationContext
// 第一种方式:这种方式我们不用调用refresh()方法,内部会自动调用
ApplicationContext cxac = new ClassPathXmlApplicationContext("spring.xml"); // 传入spring配置文件
// 第二种方式:这种方式我们需要手动调用refresh()方法
ApplicationContext cxac = new ClassPathXmlApplicationContext();
cxac.setConfigLocation("spring.xml");
cxac.refresh();
该方式在会在调用loadBeanDefinitions()的时候初始化XmlBeanDefinitionReader加载bean定义。
注解方式
实例类:AnnotationConfigApplicationContext
// 同理,第一种方式,我们不用调用refresh()方法,内部会自动调用
ApplicationContext acac = new AnnotationConfigApplicationContext("com.demo"); // 传入需要扫描的包路径
// 第二种方式,这种方式需要我们手动调用refresh()方法
ApplicationContext acac = new AnnotationConfigApplicationContext();
acac.scan("com.demo");
acac.refresh();
该方式在创建该类的构造方法中就会初始化AnnotatedBeanDefinitionReader以及ClassPathBeanDefinitionScanner,用于读取bean定义。
启动入口refresh()
无论是使用哪一个实现类,入口只有一个,那就是AbstractApplicationContext中的refresh()方法。
refresh()方法的结构清晰明了,里面的每一个调用方法都见名知意,我们从中可以知道Spring启动时的整体执行逻辑是什么。
这里有一点需要说明,因为Spring中的各种实现类众多,继承关系也很复杂,所以对于不同的实现类同一个方法的实现逻辑可能是不同的。特别是对于使用xml方式和使用注解方式,它们都何时加载bean,如何加载bean有很大的区别,但是后续的实例化以及初始化bean就没什么区别了。
追踪源码的时候,可能我们想看一个实现逻辑的时候发现有好多类都实现了这个接口,这时我们怎样才知道我们到底应该看哪个类中的逻辑呢?其实我们只需要看我们最先是从哪个类开始的,然后看这个类的继承关系中到底继承的哪个类,我们就看哪个类的逻辑。
// AbstractApplicationContext.java
public void refresh() throws BeansException, IllegalStateException {
// 执行之前先加锁,避免并发执行
synchronized(this.startupShutdownMonitor) {
// 做一些刷新前的准备工作,记录一下启动时间,校验一下环境变量
this.prepareRefresh();
// 获取beanFacotory
// 对于xml配置方式,如:ClassPathXmlApplicationContext会创建默认的DefaultListableBeanFacotory,还会加载bean定义
// 对于注解方式,如:AnnotationConfigApplicationContext这里的beanFactory是直接获取的已经创建好的,此种方式在创建
// AnnotationConfigApplicationContext时要么直接传入了自定义的beanFacotory,
// 否则就已经自动创建了默认的DefaultListableBeanFacotory
ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();
// 配置一下beanFacotory,主要是设置了一些处理器,需要忽略的接口等
this.prepareBeanFactory(beanFactory);
try {
// 该方法是一个protected的方法,交由子类实现需要的设置,
// 例如AnnotationConfigServletWebServerApplicationContext在这里实现了包扫描逻辑
this.postProcessBeanFactory(beanFactory);
// 执行所有的beanFacotoryPostProcessors,这里我们既可以通过beanFacotoryRegister注册beanDefinition,
// 也可以修改已经加载的beanDefinition的源信息
this.invokeBeanFactoryPostProcessors(beanFactory);
// 注册beanPostProcessor,包括我们自定义的,因为它会从beanFacotory中找beanPostProcessor,
// 所以我们自定义的也可以加载进来,此时还没有实例化bean,
// 所以我们自定义的beanPostProcessor可以在bean实例化和初始化的时候进行处理
this.registerBeanPostProcessors(beanFactory);
// 初始化国际化配置
this.initMessageSource();
// 初始化事件广播器
this.initApplicationEventMulticaster();
// 默认没有实现,子类中初始化了主题
this.onRefresh();
// 注册监听器,这里不仅会注册预先设置的监听器,还会查找beanFacotory中的监听器并注册,
// 所以我们自定义的监听器在此时也被注册进去了
this.registerListeners();
// 这一步最重要,因为在这一步会实例化所有的单例bean
this.finishBeanFactoryInitialization(beanFactory);
// 启动完成,通过上下文完成事件
this.finishRefresh();
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var9);
}
// 出现异常会销毁所有已创建的bean,然后停止
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
// 清除启动过程中的cache
this.resetCommonCaches();
}
}
}
invokeBeanFactoryPostProcessors()
invokeBeanFactoryPostProcessors的逻辑也是在AbstractApplicationContext实现的。
上面说了,这里会执行所有的beanFacotoryPostProcessors的处理逻辑,里面可以注册新的beanDefinition(实现了BeanDefinitionRegistryPostProcessor接口),也可以修改已有的beanDefinition(实现了BeanFactoryPostProcessors接口)。
// AbstractApplicationContext.java
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
// 实际交由PostProcessorRegistrationDelegate类去执行
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());
... // 省略无关代码
}
PostProcessorRegistrationDelegate中的步骤中可以大体分为几条线:
- 后置处理器来源分为两种:
- 参数传入
- beanFactory容器中获取
- 后置处理器类型分为两种:
- 实现了BeanDefinitionRegistryPostProcessor接口的(可以注册beanDefinition和修改beanDefinition)
- 实现了BeanFactoryPostProcessor接口的(可以修改beanDefinition)
- 后置处理器顺序分为三种:
- 实现了PriorityOrdered优先级接口的
- 实现了Ordered排序接口的
- 没有实现优先级或排序接口的
// PostProcessorRegistrationDelegate.java
public static void invokeBeanFactoryPostProcessors(
ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
Set<String> processedBeans = new HashSet<>();
// 前面我们说过了,这里主要是执行注册beanDefinition和修改beanDefinition的逻辑。
// 首先处理的是注册beanDefinition,因为基本beanFactory实现类都会实现BeanDefinitionRegistry,所以这步基本都会处理
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
// 下面这两个集合存储的是全部后置处理器,包括 参数传入的 + 容器中获取的
// 用于临时存储BeanFactoryPostProcessor类型的后置处理器
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
// 用户临时存储BeanDefinitionRegistryPostProcessor类型的后置处理器
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 循环处理我们传递进来的所有后置处理器
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
// 如果我们的处理器实现了BeanDefinitionRegistryPostProcessor接口,说明该处理器可以注册beanDefinition,那么
// 调用该处理器的的注册方法,并将该处理器添加到registryProcessors集合中
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
// 调用注册方法
registryProcessor.postProcessBeanDefinitionRegistry(registry);
registryProcessors.add(registryProcessor);
}
else {
// 如果没有实现BeanDefinitionRegistryPostProcessor接口,那么他就是BeanFactoryPostProcessor类型的处理器
// 把当前的后置处理器加入到regularPostProcessors集合中
regularPostProcessors.add(postProcessor);
}
}
// 该集合用于存储当前需要执行处理的后置处理器,每一步都会将下面需要执行处理的后置处理器添加到该集合中
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// 上面执行的是传递进来的后置处理器,这里要从容器中获取所有符合条件的后置处理器
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
// 优先处理实现了PriorityOrdered接口的后置处理器
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 通过getBean可以实例化以及初始化该后置处理器,将它添加到currentRegistryProcessors集合中,用于下面执行
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
// 将该后置处理器加入到processedBeans集合中去,避免后面重复处理
processedBeans.add(ppName);
}
}
// 对currentRegistryProcessors集合中BeanDefinitionRegistryPostProcessor进行排序
sortPostProcessors(currentRegistryProcessors, beanFactory);
// 将currentRegistryProcessors集合中的后置处理器添加到registryProcessors集合中
registryProcessors.addAll(currentRegistryProcessors);
/**
* 在这里典型的BeanDefinitionRegistryPostProcessor就是ConfigurationClassPostProcessor
* 用于进行bean定义的加载 比如我们的包扫描,@import等,我们所有加了注解的beanDefinition都是在
* 这里被扫描出来的
*/
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
// 清空当前执行的后置处理器,因为这一批执行完了,下面还需要用该集合执行下一批
currentRegistryProcessors.clear();
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
// 这里处理之前没有被处理过,且实现了Ordered接口的,下面的逻辑同上
if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
/**
* 定义一个重复处理的开关变量,为什么要定义这么一个变量呢?
* 因为BeanDefinitionRegistryPostProcessor可以注册beanDefinition,如果该后置处理器中注册了其它的实现了
* BeanDefinitionRegistryPostProcessor接口的后置处理器,那么新注册的后置处理器也需要找出来,这样实现就可以
* 找到所有的后置处理器了
*/
boolean reiterate = true;
while (reiterate) {
reiterate = false;
postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
for (String ppName : postProcessorNames) {
// 这里处理之前都没有被处理过的
if (!processedBeans.contains(ppName)) {
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
// 如果找到了未被处理的后置处理器,再次设置为true
reiterate = true;
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
currentRegistryProcessors.clear();
}
// 上面都是执行的注册逻辑,这里执行的是修改逻辑,即BeanFactoryPostProcessors的postProcessBeanFactory()方法
// 因为BeanDefinitionRegistryPostProcessor接口是继承了BeanFactoryPostProcessors接口的,所以无论哪个集合
// 中的后置处理器都存在postProcessBeanFactory()方法
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
}
else {
// 如果beanFactory本身没有实现BeanDefinitionRegistry接口,说明该容器不支持注册beanDefinition,所以直接执行
// postProcessBeanFactory()方法,忽略注册逻辑
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
// 获取容器中所有的BeanFactoryPostProcessor后置处理器,可能有人这里有疑问了,上面不是一遍遍的都获取过后置处理器了吗?
// 注意这里获取的是BeanFactoryPostProcessor类型的,上面获取的都是BeanDefinitionRegistryPostProcessor类型的。
// 不过这里需要注意的是,获取出来的后置处理器可能是包含上面已经处理了的处理器的,因为
// BeanDefinitionRegistryPostProcessor接口继承了BeanFactoryPostProcessors接口
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
// 这里也如上面一样,将后置处理器分为了实现PriorityOrdered接口的,实现Order接口的,没有实现接口的三种
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
// 如果processedBeans中包含的话,表示在上面处理BeanDefinitionRegistryPostProcessor类型处理器的时候处理过了
if (processedBeans.contains(ppName)) {
// skip - already processed in first phase above
}
else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
}
else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
orderedPostProcessorNames.add(ppName);
}
else {
nonOrderedPostProcessorNames.add(ppName);
}
}
// 按照实现PriorityOrdered接口的,实现Order接口的,没有实现接口的顺序依次调用后置处理器的postProcessBeanFactory()方法
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
// Clear cached merged bean definitions since the post-processors might have
// modified the original metadata, e.g. replacing placeholders in values...
beanFactory.clearMetadataCache();
}
经过这一步,我们使用注解标注的Bean都已经生成了最终的BeanDefinition,接下来就可以那这些BeanDefinition去创建Bean了。
finishBeanFactoryInitialization()
// AbstractApplicationContext.java
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) {
// 设置conversionService,这也是一个很重要的功能,之后会写文章专门讲解
beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class));
}
... // 忽略无关代码
// 这里会立即实例化所有非懒加载的单例bean
beanFactory.preInstantiateSingletons();
}
preInstantiateSingletons()
// DefaultListableBeanFactory.java
public void preInstantiateSingletons() throws BeansException {
// 获取我们容器中所有bean定义的名称
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
for (String beanName : beanNames) {
// 合并bean定义,这一步主要是做了什么呢?
// 1. 将其它类型的beanDefinition转变为RootBeanDefinition,将有父子关系的beanDefinition合并
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
// 当该beanDefinition不是抽象的&&单例的&&不是懒加载的时候,会直接去实例化该bean
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 判断是不是FactoryBean,工厂Bean也是一个Bean,注意不要和BeanFactory混了
if (isFactoryBean(beanName)) {
// 如果是工厂bean,给beanName前缀加上&符号,代表我们获取是FactoryBean,而不是通过FactoryBean.getObject()
// 获取的实例对象
// 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());
}
// 判断是否需要立即通过FactoryBean创建真正的Bean实例
if (isEagerInit) {
getBean(beanName);
}
}
}
else {
// 非工厂Bean,就是直接创建普通的bean
getBean(beanName);
}
}
}
// 到这里所有的单实例的bean已经记载到单实例bean到缓存中了
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
// 判断当前的bean是否实现了SmartInitializingSingleton接口,如果实现了的话,调用该bean的
// afterSingletonsInstantiated()方法,注意执行这个方法的时候,该bean已经是一个完整的bean,
// 所有的创建流程都已经走完了,该注入的信息也都已经注入了
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();
}
}
}
}
getBean() -> doGetBean()
// AbstractBeanFactory.java
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
// 在这里传入进来的name可能是别名, 也有可能是Factorybean的name,所以在这里需要转换一下名字
final String beanName = transformedBeanName(name);
Object bean;
// 先尝试从缓存中拿单例bean,如果之前创建过,这里就能直接获取到,然后返回了
Object sharedInstance = getSingleton(beanName);
if (sharedInstance != null && args == null) {
if (logger.isDebugEnabled()) {
if (isSingletonCurrentlyInCreation(beanName)) {
logger.debug("Returning eagerly cached instance of singleton bean '" + beanName +
"' that is not fully initialized yet - a consequence of a circular reference");
}
else {
logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
}
}
/**
* 如果 sharedInstance 是普通的单例 bean,下面的方法会直接返回。但如果
* sharedInstance 是 FactoryBean 类型的,则需调用 getObject 工厂方法获取真正的
* bean 实例。如果用户想获取 FactoryBean 本身,这里也不会做特别的处理,直接返回
* 即可。毕竟 FactoryBean 的实现类本身也是一种 bean,只不过具有一点特殊的功能而已。
*/
bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
}
else {
// Spring只处理单例bean的循环依赖,prototype原型bean循环依赖Spring不会处理,直接报错
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// 判断AbstractBeanFacotry工厂是否有父工厂,一般情况下,只有Spring和SpringMvc整合的时才会有父子容器的概念,
BeanFactory parentBeanFactory = getParentBeanFactory();
// 若存在父工厂,并且当前的bean工厂不存在当前的bean定义,那么去父beanFacotry中获取该bean
if (parentBeanFactory != null && !containsBeanDefinition(beanName)) {
String nameToLookup = originalBeanName(name);
if (parentBeanFactory instanceof AbstractBeanFactory) {
return ((AbstractBeanFactory) parentBeanFactory).doGetBean(
nameToLookup, requiredType, args, typeCheckOnly);
}
else if (args != null) {
return (T) parentBeanFactory.getBean(nameToLookup, args);
}
else {
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
}
/**
* 方法参数 typeCheckOnly ,是用来判断调用 getBean() 方法时,表示是否为仅仅进行类型检查获取Bean对象
* 如果不是仅仅做类型检查,而是创建 Bean 对象,则需要调用 markBeanAsCreated()方法标记为已创建,因为下面
* 就要开始真正创建了,避免出现重复创建
*/
if (!typeCheckOnly) {
markBeanAsCreated(beanName);
}
try {
final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
checkMergedBeanDefinition(mbd, beanName, args);
// 处理dependsOn的依赖(这个不是我们所谓的循环依赖 而是bean创建前后的依赖),例如我们使用@DependsOn标注的类
String[] dependsOn = mbd.getDependsOn();
if (dependsOn != null) {
for (String dep : dependsOn) {
// 判断依赖bean和被依赖bean有没有循环依赖的关系,如果有,直接抛出异常
// 因为bean创建的先后顺序依赖不能是循环依赖,否则我需要你先创建,你需要我先创建,那到底谁先创建?
if (isDependent(beanName, dep)) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
}
// 注册依赖beanName之间的映射关系:依赖 beanName - > beanName 的集合
registerDependentBean(dep, beanName);
try {
// 获取depentceOn的bean
getBean(dep);
}
catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
}
}
}
// 如果bean是单例的,那么实例化单例bean
if (mbd.isSingleton()) {
sharedInstance = getSingleton(beanName, () -> {
try {
// 实际创建bean对象的方法
return createBean(beanName, mbd, args);
}
catch (BeansException ex) {
// 创建bean的过程中发生异常,需要销毁关于当前bean的所有信息
destroySingleton(beanName);
throw ex;
}
});
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
}
// 原型bean的创建
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 {
// 指定特定scope的bean创建,这里以后会单独说
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;
}
}
// 如果getBean的时候指定了想要获取的bean的类型,并且获取出来的bean不是指定的类型,那么这里会进行bean类型转换,转换是
// 依靠类型转换器,即上面说的conversionService
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.isDebugEnabled()) {
logger.debug("Failed to convert bean '" + name + "' to required type '" +
ClassUtils.getQualifiedName(requiredType) + "'", ex);
}
throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
}
}
return (T) bean;
}
getSingleton()
这里有两个getSingletion()方法,一个是从缓存中获取bean的getSingleton()方法,一个是带有回调函数的getSingleton()方法。
从缓存中获取bean的getSingleton()
// DefaultSingletonBeanRegistry.java
protected Object getSingleton(String beanName, boolean allowEarlyReference) {
// 从单例bean一级缓存中获取
Object singletonObject = this.singletonObjects.get(beanName);
// 如果没有获取到,并且要获取的该bean正在创建中,则从提前暴露bean的二级缓存中获取,注意此时获取的可能不是最终bean,
// 如果最终bean对象与earlySingletonObjects中的对象不一致,会报错
if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
synchronized(this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName);
// 最后还没获取到,并且允许循环依赖的话,会在这里通过调用singletonFactories的方法提前暴露bean对象。
// 这里是单级缓存,调用的其实就是BeanPostProcessor中的getEarlyBeanReference()
if (singletonObject == null && allowEarlyReference) {
ObjectFactory<?> singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName);
if (singletonFactory != null) {
singletonObject = singletonFactory.getObject();
this.earlySingletonObjects.put(beanName, singletonObject);
this.singletonFactories.remove(beanName);
}
}
}
}
return singletonObject;
}
回调函数的getSingleton()
// DefaultSingletonBeanRegistry.java
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(beanName, "Bean name must not be null");
synchronized (this.singletonObjects) {
// 尝试从单例缓存池中获取对象
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
if (this.singletonsCurrentlyInDestruction) {
throw new BeanCreationNotAllowedException(beanName,
"Singleton bean creation not allowed while singletons of this factory are in destruction " +
"(Do not request a bean from a BeanFactory in a destroy method implementation!)");
}
if (logger.isDebugEnabled()) {
logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
}
// 标记当前的bean正在创建中
// singletonsCurrentlyInCreation在这里会把beanName加入进来,若第二次循环依赖,构造器注入会抛出异常,
// 因为构造器注入不允许循环依赖
beforeSingletonCreation(beanName);
boolean newSingleton = false;
boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
if (recordSuppressedExceptions) {
this.suppressedExceptions = new LinkedHashSet<>();
}
try {
// 这里其实是调用createBean()方法
singletonObject = singletonFactory.getObject();
newSingleton = true;
}
catch (IllegalStateException ex) {
singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
throw ex;
}
}
catch (BeanCreationException ex) {
if (recordSuppressedExceptions) {
for (Exception suppressedException : this.suppressedExceptions) {
ex.addRelatedCause(suppressedException);
}
}
throw ex;
}
finally {
if (recordSuppressedExceptions) {
this.suppressedExceptions = null;
}
// 将该bean从标记为正在创建中集合里删除,因为已经创建完成了
afterSingletonCreation(beanName);
}
if (newSingleton) {
// 将创建好的bean加入单例bean一级缓存中
addSingleton(beanName, singletonObject);
}
}
return singletonObject;
}
}
createBean()
// AbstractAutowireCapableBeanFactory.java
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// 确保此时的bean已经被解析了
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
try {
/**
* 验证和准备覆盖方法
* lookup-method 和 replace-method
* 这两个配置存放在BeanDefinition中的methodOverrides
* 我们知道在bean实例化的过程中如果检测到存在 methodOverrides ,
* 则会动态地为当前bean生成代理并使用对应的拦截器为bean做增强处理。
*/
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
/**
* 在实例化bean之前先通过InstantiationAwareBeanPostProcessors的postProcessBeforeInstantiation()进行处理,
* 如果返回了对象,则直接调用后置处理器的postProcessAfterInitialization()进行处理,然后将该对象当bean实例返回,
* 不再执行之后的逻辑了。
* 一般情况下在此处不会生成代理对象。不管是jdk代理还是cglib代理都不会在此处进行代理,因为我们的真实的对象没有生成,
* 所以在这里不会生成代理对象。不过这一步是AOP和事务的关键,因为在这里解析我们的aop切面信息进行缓存。
*/
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
try {
// 该步骤是我们真正的创建我们的bean的实例对象的过程
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(
mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
}
}
resolveBeforeInstantiation()
// AbstractAutowireCapableBeanFactory.java
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// 判断容器中是否有InstantiationAwareBeanPostProcessors类型的后置处理器
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
// 推断当前bean的class对象
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
// 后置处理器的【第一次】调用,此处会解析出切面信息保存到缓存中
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
// 如果InstantiationAwareBeanPostProcessors后置处理器的postProcessBeforeInstantiation返回不为null,
// 直接调用所有后置处理器的postProcessAfterInitialization()方法
if (bean != null) {
// 后置处理器的【第二次】调用,该后置处理器若被调用的话,那么第一处的处理器肯定返回的不是null
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
doCreateBean()
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) throws BeanCreationException {
// BeanWrapper是对Bean的包装,其接口中所定义的功能很简单包括设置获取被包装的对象,获取被包装bean的属性描述器
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
// 真正创建bean实例的地方,使用合适的实例化策略来创建新的实例:工厂方法、构造函数自动注入、简单初始化
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
final Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
mbd.resolvedTargetType = beanType;
}
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// 后置处理器的【第三次】调用,这一步,会将@autowired和@value这类注解的元数据提取出来,为下面的注入做准备
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
// 是否允许提前暴露单例(是单例 && 允许循环依赖 && 该bean在创建中)
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
// 第一次判断:如果允许提前暴露,则将bean放入singletonFacotries中, 在循环依赖的时候,可以通过
// getEarlyBeanReference()提前自动代理,然后在其他bean中注入提前代理的对象
if (earlySingletonExposure) {
if (logger.isDebugEnabled()) {
logger.debug("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
// 后置处理器【第四次】调用
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
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);
}
}
/**
* 第二次判断,主要是为了防止提前暴露的bean和最终实际的bean不一致,如果我们没有自定义或者引入会创建代理对象的
* BeanPostProcessor的话,是不会有问题的,因为在spring的AbstractAutoProxyCreator中,如果已经通过
* getEarlyBeanReference提前创建过代理对象了,那么在postProcessAfterInitialization中会直接跳过代理对象的创建,
* 然后将原bean对象返回,所以下面的exposedObject == bean是true, 又因为在postProcessAfterInitialization跳过了
* 自动代理类的创建,但是在getEarlyBeanReference中代理了,所以要将earlySingletonReference赋给exposedObject,
* 保证返回的bean和提前代理并注入的bean是一致的。
* 所以如果我们如果想自定义BeanPostProcessor并要代理bean对象的话,需要按照AbstractAutoProxyCreator处理循环依赖
* 的模式去实现,既要实现getEarlyBeanReference,还要实现postProcessAfterInitialization,如果调用过了
* getEarlyBeanReference,提前暴露了bean对象,那么在postProcessAfterInitialization中要跳过
* getEarlyBeanReference中的实现逻辑,而且不要改变bean对象
*/
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
if (earlySingletonReference != null) {
if (exposedObject == bean) {
exposedObject = earlySingletonReference;
}
else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
String[] dependentBeans = getDependentBeans(beanName);
Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
for (String dependentBean : dependentBeans) {
if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
actualDependentBeans.add(dependentBean);
}
}
if (!actualDependentBeans.isEmpty()) {
throw new BeanCurrentlyInCreationException(beanName,
"Bean with name '" + beanName + "' has been injected into other beans [" +
StringUtils.collectionToCommaDelimitedString(actualDependentBeans) +
"] in its raw version as part of a circular reference, but has eventually been " +
"wrapped. This means that said other beans do not use the final version of the " +
"bean. This is often the result of over-eager type matching - consider using " +
"'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for example.");
}
}
}
}
// Register bean as disposable.
try {
// 后置处理器【第九次】调用,在销毁bean时,会调用DestructionAwareBeanPostProcessor类型后置处理器的
// postProcessBeforeDestruction()方法
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
}
return exposedObject;
}
扩展知识:
spring解决循环依赖为什么需要三层缓存?
singletonObjects是存放已经处理完成的最终单例bean的。
singletonFactories是存放用于提前暴露单例bean对象的对象工厂,如果存在循环依赖,才会调用对象工厂的方法提前暴露单例bean对象,否则不会调用。
earlySingletonObjects是存放提前暴露还没有最终完成的单例对象的,此时它还不能算是单例bean对象。而且上面通过判断earlySingletonObjects中是否存在提前暴露的对象,以及判断提前暴露的对象和最终的bean对象是否是一致的来防止程序出错。
populateBean()
protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
// 如果bw为null的话,则说明对象没有实例化
if (bw == null) {
// 进入if说明对象有属性,bw为空,不能为他设置属性,那就在下面就执行抛出异常
if (mbd.hasPropertyValues()) {
throw new BeanCreationException(
mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
}
else {
// Skip property population phase for null instance.
return;
}
}
/**
* 在属性被填充前,给InstantiationAwareBeanPostProcessor类型的后置处理器一个修改bean状态的机会。
* 官方的解释是:让用户可以自定义属性注入。比如用户实现一个InstantiationAwareBeanPostProcessor类型的后置处理器,
* 并通过postProcessAfterInstantiation方法向bean的成员变量注入自定义的信息。
*/
boolean continueWithPropertyPopulation = true;
// 判断是否持有InstantiationAwareBeanPostProcessor
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
// 后置处理器【第五次】调用,postProcessAfterInstantiation:如果应该继续在bean上面设置属性则返回true,
// 否则返回false。如果返回了false,则不会继续执行下面的逻辑了
if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
continueWithPropertyPopulation = false;
break;
}
}
}
}
// 如果后续处理器发出停止填充命令,则终止后续操作
if (!continueWithPropertyPopulation) {
return;
}
//获取bean定义的属性
PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
/**
* 判断我们的bean的属性注入模型,这里处理的xml配置的内容,注解配置的不是在这里处理
* AUTOWIRE_BY_NAME 根据名称注入
* AUTOWIRE_BY_TYPE 根据类型注入
*/
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
// 把PropertyValues封装成为MutablePropertyValues
MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
// 根据bean的属性名称注入
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
// 根据bean的类型进行注入
if (mbd.getResolvedAutowireMode() == AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
// 把处理过的 属性覆盖原来的
pvs = newPvs;
}
/**
* 用于在Spring填充属性到bean对象前,对属性的值进行相应的处理,比如可以修改某些属性的值。
* 这时注入到bean中的值就不是配置文件中的内容了,而是经过后置处理器修改后的内容。
*/
boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
// 判断是否需要检查依赖
boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
if (hasInstAwareBpps || needsDepCheck) {
if (pvs == null) {
pvs = mbd.getPropertyValues();
}
// 取出当前正在创建的beanWrapper依赖的对象
PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
if (hasInstAwareBpps) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
// 后置处理器【第六次】调用,对依赖对象进行后置处理
pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
if (pvs == null) {
return;
}
}
}
}
//判断是否检查依赖
if (needsDepCheck) {
checkDependencies(beanName, mbd, filteredPds, pvs);
}
}
/**
* 其实,上面只是完成了所有注入属性的获取,将获取的属性封装在PropertyValues的实例对象 pvs 中,
* 并没有应用到已经实例化的bean中。而applyPropertyValues() 方法,则是完成真正注入的。
*/
if (pvs != null) {
applyPropertyValues(beanName, mbd, bw, pvs);
}
}
initializeBean()
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd){
if (System.getSecurityManager() != null) {
AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
invokeAwareMethods(beanName, bean);
return null;
}, getAccessControlContext());
}
else {
// 若我们的bean实现了XXXAware接口,在这里进行接口方法的回调,
// 注意这里只是处理了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware这三个接口的回调。
// 与application有关的aware接口回调是在ApplicationContextAwareProcessor.postProcessBeforeInitialization()
// 方法中处理的,包括:EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、
// ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware。
// ImportAware是在ImportAwareBeanPostProcessor.postProcessBeforeInitialization()处理的。
invokeAwareMethods(beanName, bean);
}
Object wrappedBean = bean;
if (mbd == null || !mbd.isSynthetic()) {
// 后置处理器【第七次】调用,调用我们的bean的后置处理器的postProcessorsBeforeInitialization方法
// @PostConstruct注解的方法就是在这一步被调用的
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
// 调用初始化方法
// InitializingBean接口,init-method方法
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()) {
// 后置处理器【第八次】调用,调用我们bean的后置处理器的PostProcessorsAfterInitialization方法
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
return wrappedBean;
}
至此,Spring的bean创建流程就结束了。