org.springframework.context.ApplicationContext接口代表 Spring IoC 容器,负责实例化、配置和组装 bean。容器通过读取配置元数据来获取需要被实例化、配置的对象,
配置元数据包括 XML、Java 注解或 Java BeanConfig等。本文详解容器初始过程。
配置元数据
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.xia.xmlbean.MyBean">
<!-- 这里可以填充属性,注入等。 -->
</bean>
<bean id="xxx" class="xxxx">
<!-- 配置你自己的类 -->
</bean>
</beans>
关注公众号【Code视角】深入学习Spring等Java相关知识。
package com.xia.annotation;
import org.springframework.stereotype.Component;
@Component
public class MyBean {
public void helloWord(){
System.out.println("helloWord");
}
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext("com.xia.annotation");
context.getBean(MyBean.class).helloWord();
}
}
public class MyBean {
public void helloWord(){
System.out.println("helloWord");
}
}
@Configuration
public class ConfigBean {
@Bean
public MyBean createMyBean(){
return new MyBean();
}
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigBean.class);
ctx.getBean(MyBean.class).helloWord();
}
}
实例化容器
// 多种ApplicationContext实现类
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
使用容器
// 多种ApplicationContext实现类
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
context.getBean(MyBean.class).helloWord();
// 或者这样
GenericApplicationContext context1 = new GenericApplicationContext();
new XmlBeanDefinitionReader(context1).loadBeanDefinitions("applicationContext.xml");
context1.refresh();
context1.getBean(MyBean.class).helloWord();
关注公众号【Code视角】深入学习Spring等Java相关知识。
ApplicationContext继承了六个接口、每个接口都赋予了它特有的功能。
核心接口
ListableBeanFactory继承BeanFactory、BeanFactory定义了bean的获取、创建等。 部分方法如下
@Nullable
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean containsBean(String name);
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
Object getBean(String name) throws BeansException;
// 这个属性很重要 在FactoryBean创建对象时,会创建两个对象、一个是FactoryBean对象本身,还有一个getBean的对象,这个时候FactoryBean对象的beanName会加上&
String FACTORY_BEAN_PREFIX = "&";
ListableBeanFactory 是对Bean获取上进行增强,对BeanDefinition的统计等 BeanDefinition是bean定义信息。部分方法如下
// 检查bean定义信息
boolean containsBeanDefinition(String beanName);
// 获取注册表数量
int getBeanDefinitionCount();
// 工厂中定义的所有bean的名称。
String[] getBeanDefinitionNames();
HierarchicalBeanFactory继承BeanFactory、主要应用于层级体系的容器类、给容器提供了父子容器实现的定义。
// 回当前BeanFactory的父BeanFactory
@Nullable
BeanFactory getParentBeanFactory();
// 检测当前BeanFactory中是否包含指定名字的Bean。不去检测其父BeanFactory中是否包含类似于Listable中的查找Bean的方法
boolean containsLocalBean(String name);
辅助功能接口
EnvironmentCapable定义了获取Environment实例的方法,Environment是Spring容器中获取配置属性的对象,属性包括但不限于 系统属性、环境变量等
// 获取Environment实例
Environment getEnvironment();
MessageSource为容器定义了支持国际化的功能,目前笔者工作中没有遇到过,故不进行编写
ApplicationEventPublisher 为容器提供事件发布功能,这里在工作中使用较多,重点,部分方法如下
// ApplicationEventPublisher被@FunctionalInterface修饰,说明它是函数式接口
// 通知应用所有已注册且匹配的监听器此ApplicationEvent
default void publishEvent(ApplicationEvent event) {
publishEvent((Object) event);
}
// 通知应用所有已注册且匹配的监听器此Event ,如果这个Event不是一个ApplicationEvent,则其被包裹于PayloadApplicationEvent
void publishEvent(Object event);
ResourcePatternResolver用于解析资源文件的策略接口,继承于ResourceLoader接口,为Spring容器提供了加载资源的能里
ResourceLoader 资源解析
// 解析资源,返回Resource资源数据
Resource getResource(String location);
@Nullable
ClassLoader getClassLoader();
ResourcePatternResolver
// 对ResourceLoader进行增强,可以加载多个资源数据
Resource[] getResources(String locationPattern) throws IOException;
这里笔者教大家一个源码小技巧,如果找不到源码接口的实现类,可以试着 Defaultxxx找它的默认实现
把如上几个接口串联起来的话,就会发现,Spring容器提供了,资源加载(元数据加载)、SpringBean获取,注册表数据获取, 事件发布等。 这个时候应该有个疑问: bean创建呢?
ApplicationContext部分实现
这个类实现了Spring容器的初始化核心方法org.springframework.context.support.AbstractApplicationContext#refresh,主要对于Bean创建、增强(AOP)、事件发布等。代码的设计模式为++模板方法++,笔者将在下文进行详细讲解。
org.springframework.context.support.ClassPathXmlApplicationContext
org.springframework.context.support.FileSystemXmlApplicationContext
org.springframework.web.context.support.AbstractRefreshableWebApplicationContext
web抽象
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
org.springframework.web.context.support.XmlWebApplicationContext
通过阅读Spring源码发现,Spring在对核心功能扩展的时候都是通过继承现有的类,然后核心不变,只对外围的资源加载和输出进行改变,迎合需求。这种设计需要很高的抽象概念、良好的设计思想。
例如:
org.springframework.context.support.AbstractXmlApplicationContext
子类有:
org.springframework.context.support.ClassPathXmlApplicationContext
org.springframework.context.support.FileSystemXmlApplicationContext
见名知意, 核心都是通过Xml文件加载数据,只是源头不同。
ClassPathXmlApplicationContext 通过类路径下的xml进行加载。
FileSystemXmlApplicationContext 可以指定绝对路径进行加载xml。
笔者以++org.springframework.context.annotation.AnnotationConfigApplicationContext++为例讲解容器的初始化过程
源码解析
入口方法
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext("com.xia.annotation");
context.getBean(MyBean.class).helloWord();
}
实例化Context对象
public AnnotationConfigApplicationContext(String... basePackages) {
// 调用无参构造方法 这里在创建父类的时候 为应用上下文创建一个默认的DefaultListableBeanFactory
this();
// 扫描包路径
scan(basePackages);
// 核心方法 来自于org.springframework.context.support.AbstractApplicationContext#refresh
refresh();
}
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.String…) 之this();
构造无参构造器,创建注解bean定义读取器,和注册bean元数据扫描器
public AnnotationConfigApplicationContext() {
// 分步记录ApplicationStartup各个阶段的时间或者指标数据
StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
// 创建元数据扫描器,因为注解是后期扩展,所以最初的Spring读取器不适用,那么就需要扩展自己的bean定义读取器
this.reader = new AnnotatedBeanDefinitionReader(this);
// 创建解析器环境结束
createAnnotatedBeanDefReader.end();
// 创建BeanDefinition扫描器
// 可以用来扫描包或者类,生成bean定义信息
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
1.1 获取Environment,创建ConditionEvaluator,注册内置注解后置处理器。需要传入一个Spring容器,所以这里传入的是this。
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
// getOrCreateEnvironment(registry)
// 这个方法是为了获取Environment,存储运行时环境变量
this(registry, getOrCreateEnvironment(registry));
}
// 然后其重载的构造方法
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
Assert.notNull(environment, "Environment must not be null");
this.registry = registry;
this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);
// 注册注解配置的的处理器
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
1.2 AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
给当前传入的BeanDefinitionRegistry注册注解处理器,简单来说就是给当前Spring容器注入内置的注解后置处理器(重要), 下面我们对源码进行解读。
public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
registerAnnotationConfigProcessors(registry, null);
}
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
BeanDefinitionRegistry registry, @Nullable Object source) {
// 得到DefaultListableBeanFactory工厂
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null) {
// 判断有没有处理注解的排序器,就是判断容器Comparator
// 第一次初始化 这里是null 所以会set一个AnnotationAwareOrderComparator.INSTANCE 自定义注解排序器
if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
}
// 对bean依赖进行处理的策略接口。
// 这里默认值不是处理注解的实例,所以需要重新set一个ContextAnnotationAutowireCandidateResolver
// ContextAnnotationAutowireCandidateResolver 这里定义了如何处理延迟加载,会判断【Lazy】这个注解
if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
}
}
// 创建了一个链表来保存注册的BeanDefinition, 方便传递
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
//注册一个配置类解析器的bean定义(ConfigurationClassPostProcessor)
//先从AbstractApplicationContext抽象类中获取到默认的BeanFactory(DefaultListableBeanFactory)判断成员属性beanDefinitionMap中是否包含internalConfigurationAnnotationProcessor处理器 【很显然不包含】
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
//ConfigurationClassPostProcessor这个处理器主要解析配置类的信息的处理器很重要
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
def.setSource(source);
//并添加到容器中 registerPostProcessor这一步 主要创建了BeanDefinitionHolder持有器里边包含BeanDefinition还有beanName,如果有别名会把别名也进行保存,方便通过beanName来查找,强。
// registerPostProcessor这个方法在转换成持有器的同时,也会往DefaultListableBeanFactory的beanDefinitionMap中保存一份key就是beanName(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)value就是处理器
beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 设置AutoWired注解解析器的bean定义信息, 这里首次创建是不包含的。
if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
// 创建了一个AutowiredAnnotationBeanPostProcessor处理器并创建一个持有器注册到容器中
// 持有器就是包含BeanDefinition和这个BeanDefinition的BeanName和别名
// AutowiredAnnotationBeanPostProcessor 对AutowiredAnnotationBean解析器
RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.
if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {
// 对JSR-250 注解支持,这里也会完成注册
RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 检查是否支持jpa, 这里要看是否使用jpa做为持久层框架,否则是不会进行注册的。
if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {
// JPA注解支持
RootBeanDefinition def = new RootBeanDefinition();
try {
def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,
AnnotationConfigUtils.class.getClassLoader()));
}
catch (ClassNotFoundException ex) {
throw new IllegalStateException(
"Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);
}
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// 对事件注解进行处理的处理器 EventListenerMethodProcessor。 首次初始化会进行注册。 【@EventListener 】 这类注解的处理
if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {
// 事件监听
RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));
}
//注册化事件监听工厂处理器
//主要处理@EventListener注解配合第7步
if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {
RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);
def.setSource(source);
beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));
}
return beanDefs;
}
1.2.1 registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME) 方法是如何注册的。 实际来说 就是注册到beanFactory中beanDefinitionMap属性中,后续进行使用。
private static BeanDefinitionHolder registerPostProcessor(BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {
definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
// 核心在这个方法 调用容器的注册bean定义信息进行注册
registry.registerBeanDefinition(beanName, definition);
return new BeanDefinitionHolder(definition, beanName);
}
org.springframework.context.support.GenericApplicationContext#registerBeanDefinition
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
this.beanFactory.registerBeanDefinition(beanName, beanDefinition);
}
org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition (注册bean定义信息的核心方法,后面代码也都会使用这个 所以需要着重讲解下)
@Override
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
throws BeanDefinitionStoreException {
Assert.hasText(beanName, "Bean name must not be empty");
Assert.notNull(beanDefinition, "BeanDefinition must not be null");
if (beanDefinition instanceof AbstractBeanDefinition) {
try {
((AbstractBeanDefinition) beanDefinition).validate();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
"Validation of bean definition failed", ex);
}
}
// 是否已经注册
BeanDefinition existingDefinition = this.beanDefinitionMap.get(beanName);
if (existingDefinition != null) {
if (!isAllowBeanDefinitionOverriding()) {
throw new BeanDefinitionOverrideException(beanName, beanDefinition, existingDefinition);
}
else if (existingDefinition.getRole() < beanDefinition.getRole()) {
// e.g. was ROLE_APPLICATION, now overriding with ROLE_SUPPORT or ROLE_INFRASTRUCTURE
if (logger.isInfoEnabled()) {
logger.info("Overriding user-defined bean definition for bean '" + beanName +
"' with a framework-generated bean definition: replacing [" +
existingDefinition + "] with [" + beanDefinition + "]");
}
}
else if (!beanDefinition.equals(existingDefinition)) {
if (logger.isDebugEnabled()) {
logger.debug("Overriding bean definition for bean '" + beanName +
"' with a different definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
else {
if (logger.isTraceEnabled()) {
logger.trace("Overriding bean definition for bean '" + beanName +
"' with an equivalent definition: replacing [" + existingDefinition +
"] with [" + beanDefinition + "]");
}
}
// beanFactory 中的注册表就是 beanDefinitionMap 属性
// private final Map beanDefinitionMap = new ConcurrentHashMap<>(256);
// 这里是ConcurrentHashMap多线程下线程安全
this.beanDefinitionMap.put(beanName, beanDefinition);
}
else {
// 如果是普通的bean元信息, 这里是会判断 当前容器是否处于启动状态,启动状态下,不允许对元素进行修改, 为什么?
// 是为了迭代安全, 设计的严谨。
if (hasBeanCreationStarted()) {
// Cannot modify startup-time collection elements anymore (for stable iteration)
synchronized (this.beanDefinitionMap) {
this.beanDefinitionMap.put(beanName, beanDefinition);
List<String> updatedDefinitions = new ArrayList<>(this.beanDefinitionNames.size() + 1);
updatedDefinitions.addAll(this.beanDefinitionNames);
updatedDefinitions.add(beanName);
this.beanDefinitionNames = updatedDefinitions;
removeManualSingletonName(beanName);
}
}
else {
// Still in startup registration phase
this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName);
removeManualSingletonName(beanName);
}
this.frozenBeanDefinitionNames = null;
}
if (existingDefinition != null || containsSingleton(beanName)) {
resetBeanDefinition(beanName);
}
else if (isConfigurationFrozen()) {
clearByTypeCache();
}
}
【AnnotatedBeanDefinitionReader】小结:总体来说就是初始化了Ioc容器和各种的BeanDefinition的处理器注册到Ioc的BeanDefinitionMap中容器中。值得注意的是,这里都不进行实例化bean对象,为什么? 个人理解:分层、业务解耦 所有的bean创建都放到核心方法进行处理。
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) {
// 需要注意的是这里 useDefaultFilters 参数传的是true。
// 是否需要处理特定注解 ture 是处理, false 不处理
// useDefaultFilters这里默认是true,扫描带有@Component ro @Repository ro @Service ro @Controller 的组件
其中@Repository @Service @Controller都实现了@Component
this(registry, true);
}
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {
this(registry, useDefaultFilters, getOrCreateEnvironment(registry));
}
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {
this(registry, useDefaultFilters, getOrCreateEnvironment(registry));
}
吐槽下 调用的真深啊!!!!!
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
Environment environment) {
// 这里registry本身就实现了ResourceLoader 所以可以当作读取器
this(registry, useDefaultFilters, environment,
(registry instanceof ResourceLoader ? (ResourceLoader) registry : null));
}
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
Environment environment, @Nullable ResourceLoader resourceLoader) {
Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
this.registry = registry;
// 这里前面默认传递的是true
if (useDefaultFilters) {
//注册包扫描默认的规则
registerDefaultFilters();
}
// 设置环境属性。
setEnvironment(environment);
//设置资源加载器
setResourceLoader(resourceLoader);
}
2.1 registerDefaultFilters()
当调用这个方法后,会把拦截规则进行添加,简单来说就是说 扫描的时候会把带有Component的类或者 JSR-330,JSR-250规则的类,进行读取,注册注册表。
protected void registerDefaultFilters() {
// 添加Component注解拦截规则实例。
this.includeFilters.add(new AnnotationTypeFilter(Component.class));
ClassLoader cl = ClassPathScanningCandidateComponentProvider.class.getClassLoader();
try {
this.includeFilters.add(new AnnotationTypeFilter(
((Class<? extends Annotation>) ClassUtils.forName("javax.annotation.ManagedBean", cl)), false));
logger.trace("JSR-250 'javax.annotation.ManagedBean' found and supported for component scanning");
}
catch (ClassNotFoundException ex) {
// JSR-250 1.1 API (as included in Java EE 6) not available - simply skip.
}
try {
this.includeFilters.add(new AnnotationTypeFilter(
((Class<? extends Annotation>) ClassUtils.forName("javax.inject.Named", cl)), false));
logger.trace("JSR-330 'javax.inject.Named' annotation found and supported for component scanning");
}
catch (ClassNotFoundException ex) {
// JSR-330 API not available - simply skip.
}
}
2.2 setResourceLoader(resourceLoader);
// AnnotationConfigApplicationContext实现了resourceLoader,向上转型
@Override
public void setResourceLoader(@Nullable ResourceLoader resourceLoader) {
//判断resourceLoader是否属于resourcePatternResolver是的话强转不是的话PathMatchingResourcePatternResolver创建一个【默认是AnnotationConfigApplicationContext类型】主要作用是解析本地的pattern(类似与正则匹配url)
this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
//创建一个CachingMetadataReaderFactory 并且往DefaultResourceLoader中缓存resourceCaches缓存了一份MetadataReader
//metadataReader对一个类的各种元数据都封装成一个MetadataReader 一个类的元数据主要包括类上的注解
this.metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader);
//初始化了一个CandidateComponentsIndex(带有缓存 key为类加载器下次使用可以直接去缓存中获取)
//初始化了一个@Componet的index值处理器
this.componentsIndex = CandidateComponentsIndexLoader.loadIndex(this.resourcePatternResolver.getClassLoader());
}
【ClassPathBeanDefinitionScanner】小结:主要初始化了@Component的过滤器,设置了一些环境,加载了resourcePatternResolver、metadataReaderFactory(类元数据工厂)、componentsIndex
初始化中的【this()】讲解完毕,这里主要对容器的各种属性赋值,使之有加载、处理元数据的能力和空间
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.String…) 之scan(basePackages);
这里开始复制
@Override
public void scan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
StartupStep scanPackages = this.getApplicationStartup().start("spring.context.base-packages.scan").tag("packages", () -> Arrays.toString(basePackages));
// 这里调用 ClassPathBeanDefinitionScanner scan() 方法。
this.scanner.scan(basePackages);
scanPackages.end();
}
public int scan(String... basePackages) {
// 获取当前容器中BeanDefinition数量 beanDefinitionMap.size();
int beanCountAtScanStart = this.registry.getBeanDefinitionCount();
// 扫描元数据
doScan(basePackages);
// Register annotation config processors, if necessary.
if (this.includeAnnotationConfig) {
// 这里在初始化的时候 已经注册了内置的后置处理器
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
}
// 业务BeanDefinition数量 需要减去内置处理器的数量
return (this.registry.getBeanDefinitionCount() - beanCountAtScanStart);
}
1.1 org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan
根据传入的包路径,把包中带有注解的类解析成BeanDefinition。
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>();
for (String basePackage : basePackages) {
// 核心方法 把包中类解析成BeanDefinition。
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
for (BeanDefinition candidate : candidates) {
// 解析注解Bean定义类中的作用域元信息
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
candidate.setScope(scopeMetadata.getScopeName());
String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);
if (candidate instanceof AbstractBeanDefinition) {
// 对BeanDefinition进行完善
postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
}
if (candidate instanceof AnnotatedBeanDefinition) {
// 这里也是 进行完善, 主要针对注解的
// 最终会调用这个方法 org.springframework.context.annotation.AnnotationConfigUtils#processCommonDefinitionAnnotations(org.springframework.beans.factory.annotation.AnnotatedBeanDefinition, org.springframework.core.type.AnnotatedTypeMetadata)
// 把metadata中的 @Lazy、 @Primary、@DependsOn、 @Role、 @Description 等元数据赋值到candidate对应的属性上面
AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
}
// 是否存在数据冲突
if (checkCandidate(beanName, candidate)) {
// 生成最终的BeanDefinitionHolder
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
// 根据注解Bean 定义类中配置的作用域,创建相应的代理对象
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
beanDefinitions.add(definitionHolder);
// 注册到容器中的注册表
registerBeanDefinition(definitionHolder, this.registry);
}
}
}
return beanDefinitions;
}
1.1.1 org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents
public Set<BeanDefinition> findCandidateComponents(String basePackage) {
if (this.componentsIndex != null && indexSupportsIncludeFilters()) {
return addCandidateComponentsFromIndex(this.componentsIndex, basePackage);
}
else {
// 调这里
return scanCandidateComponents(basePackage);
}
}
private Set<BeanDefinition> scanCandidateComponents(String basePackage) {
Set<BeanDefinition> candidates = new LinkedHashSet<>();
try {
// 通过包路径 拼接Class路径 例如:classpath*:com/xia/annotation/**/*.class
String packageSearchPath = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
resolveBasePackage(basePackage) + '/' + this.resourcePattern;
// 构造方法注册的资源解析器,然后class路径加载资源
// 调用这个方法org.springframework.context.support.GenericApplicationContext#getResources
// 然后又调用了org.springframework.context.support.AbstractApplicationContext#getResources
// 最终调用到 org.springframework.core.io.support.PathMatchingResourcePatternResolver#getResources
// 之后调用 org.springframework.core.io.support.PathMatchingResourcePatternResolver#findPathMatchingResources 这个方法把类路径转换成绝对路径找到class文件,然后把file构建成org.springframework.core.io.FileSystemResource#FileSystemResource(java.io.File)类
Resource[] resources = getResourcePatternResolver().getResources(packageSearchPath);
boolean traceEnabled = logger.isTraceEnabled();
boolean debugEnabled = logger.isDebugEnabled();
for (Resource resource : resources) {
if (traceEnabled) {
logger.trace("Scanning " + resource);
}
try {
// 获取注册的MetadataReader,然后传入参数resource
MetadataReader metadataReader = getMetadataReaderFactory().getMetadataReader(resource);
// 这里就是处理前面说的注解规则 类是否@Component 如果有就进行解析, 很重要 请注意
if (isCandidateComponent(metadataReader)) {
// new ScannedGenericBeanDefinition 实例 这个时候设置beanName和资源,对于bean标签还未解析
ScannedGenericBeanDefinition sbd = new ScannedGenericBeanDefinition(metadataReader);
sbd.setSource(resource);
if (isCandidateComponent(sbd)) {
if (debugEnabled) {
logger.debug("Identified candidate component class: " + resource);
}
// add 返回
candidates.add(sbd);
}
else {
if (debugEnabled) {
logger.debug("Ignored because not a concrete top-level class: " + resource);
}
}
}
else {
if (traceEnabled) {
logger.trace("Ignored because not matching any filter: " + resource);
}
}
}
catch (FileNotFoundException ex) {
if (traceEnabled) {
logger.trace("Ignored non-readable " + resource + ": " + ex.getMessage());
}
}
catch (Throwable ex) {
throw new BeanDefinitionStoreException(
"Failed to read candidate component class: " + resource, ex);
}
}
}
catch (IOException ex) {
throw new BeanDefinitionStoreException("I/O failure during classpath scanning", ex);
}
return candidates;
}
1.1.2 org.springframework.context.annotation.AnnotationScopeMetadataResolver#resolveScopeMetadata
@Override
public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) {
ScopeMetadata metadata = new ScopeMetadata();
if (definition instanceof AnnotatedBeanDefinition) {
AnnotatedBeanDefinition annDef = (AnnotatedBeanDefinition) definition;
//从注解Bean定义类的属性中查找属性为”Scope”的值,即@Scope注解的值
//annDef.getMetadata().getAnnotationAttributes()方法将Bean
//中所有的注解和注解的值存放在一个map集合中
AnnotationAttributes attributes = AnnotationConfigUtils.attributesFor(
annDef.getMetadata(), this.scopeAnnotationType);
//将获取到的@Scope注解的值设置到要返回的对象中
if (attributes != null) {
metadata.setScopeName(attributes.getString("value"));
//获取@Scope注解中的proxyMode属性值,在创建代理对象时会用到
ScopedProxyMode proxyMode = attributes.getEnum("proxyMode");
//如果@Scope的proxyMode属性为DEFAULT或者NO
if (proxyMode == ScopedProxyMode.DEFAULT) {
//设置proxyMode为NO
proxyMode = this.defaultProxyMode;
}
//为返回的元数据设置proxyMode
metadata.setScopedProxyMode(proxyMode);
}
}
return metadata;
}
初始化中的【scan(basePackages)】讲解完毕。 主要核心来说就是通过包路径加载所有的Class文件, 然后通过注解规则拦截器,把带有注解的需要交给Spring管理的类进行读取和解析元标签,然后构建成BeanDefinitionHolder注册到beanFactroy工厂。 这里面用到了容器构造时的资源读取器,解析器等。
org.springframework.context.annotation.AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(java.lang.String…) 之refresh();
【refresh()】方法是Spring容器的核心,其它方法你都可以不懂,但是这个方法 笔者希望大家都可以懂。 核心就是生成bean对象,对bean进行增强,解决循环依赖等问题。
@Override
public void refresh() throws BeansException, IllegalStateException {
// private final Object startupShutdownMonitor = new Object();
// 通过synchronized进行上锁,所以是线程安全的
// 因为Spring如果创建单例的bean那么是通过Map来保存bean实例来判断是否已经创建了
// 如果多线程就会创建多个bean实例了
synchronized (this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
// 刷新上下文
// 1. 设置容器属性 为活跃状态
// 2. 把所有的属性标记为可解析的
// 3. 初始化earlyApplicationListeners属性 (监听)
// 4. 初始化earlyApplicationEvents属性 (事件)
prepareRefresh();
// 刷新子类的工厂
// 1. 调用 org.springframework.context.support.AbstractApplicationContext#refreshBeanFactory
// 修改容器为活跃状态并且给容器一个序列化id,可以通过id 进行反序列化
// 2. 调用org.springframework.context.support.AbstractApplicationContext#getBeanFactory
// 返回当前容器
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// bean工厂准备 主要为了给beanFactory创建bean提供帮助
// 这里会setBeanClassLoader、构建bean表达式策略 等等 下文进行详细讲解
prepareBeanFactory(beanFactory);
try {
// 模板方法可由子类重写 进行beanFactory的处理, 扩展方法, 这里没有重写略过
postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// 实例化并调用BeanFactory后置处理器 下文详细讲解
invokeBeanFactoryPostProcessors(beanFactory);
// 注册bean的前置后置处理器。(tips:触发时机是bean实例化后,在bean初始化的前后。)
// org.springframework.context.support.AbstractApplicationContext#registerBeanPostProcessors 下文详细解释
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// 初始化国际化用到的资源 这里暂不做讲解
initMessageSource();
// 初始化事件监听多路广播器 下文进行详解
// org.springframework.context.support.AbstractApplicationContext#initApplicationEventMulticaster
initApplicationEventMulticaster();
// 扩展方法 交给子类实现 去实例化特殊的bean. 这里未作实现
onRefresh();
// 注册事件监听器,发布需要提前广播的事件 下文详解
registerListeners();
// 实例化剩下未初始化并且非延迟加载的单例 下文详解
finishBeanFactoryInitialization(beanFactory);
// 广播事件:ApplicationContext初始化完成
finishRefresh();
} catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
} finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
contextRefresh.end();
}
}
}
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
//设置类加载器:存在则直接设置/不存在则新建一个默认类加载
beanFactory.setBeanClassLoader(getClassLoader());
if (!shouldIgnoreSpel) {
// 设置EL表达式解析器(Bean初始化完成后填充属性时会用到)
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
}
//设置属性注册解析器PropertyEdito
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
// 将当前的ApplicationContext对象交给ApplicationContextAwareProcessor类来处理,从而在Aware接口实现类中的注入applicationContext
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
// 这里主要是忽略哪些不需要自动装配的接口,主要都是Spring 容器中的感知接口 可以参考Spring概览文章中的感知接口详解
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
beanFactory.ignoreDependencyInterface(ApplicationStartupAware.class);
//注册可以解析的自动装配 可以参考Spring概览文章中的感知接口详解
beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
// 如果当前BeanFactory包含loadTimeWeaver Bean,说明存在类加载期织入AspectJ,则把当前BeanFactory交给类加载期BeanPostProcessor实现类LoadTimeWeaverAwareProcessor来处理,从而实现类加载期织入AspectJ目的。
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));
// 注册当前容器环境environment组件Bean
if (!NativeDetector.inNativeImage() && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
// Set a temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
// 注册当前容器环境environment组件Bean
if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
}
//注册系统配置systemProperties组件Bean
if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
}
//注册系统环境systemEnvironment组件Bean
if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
}
// 这里是各个阶段的启动日志
if (!beanFactory.containsLocalBean(APPLICATION_STARTUP_BEAN_NAME)) {
beanFactory.registerSingleton(APPLICATION_STARTUP_BEAN_NAME, getApplicationStartup());
}
}
protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
// getBeanFactoryPostProcessors()方法 就是返回beanFactoryPostProcessors 属性
// 这里保存前面解析元数据后的beanFactoryPostProcessors定义信息
// 然后调用org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors(org.springframework.beans.factory.config.ConfigurableListableBeanFactory, java.util.List)
// 传入参数 当前工厂,和所有的beanFactoryPostProcessors定义信息
// 下文对其进行讲解
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());
// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime
// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)
if (!NativeDetector.inNativeImage() && beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
}
}
2.1 org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors()
public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
// 保存BeanFactory后置处理器 例如:org.springframework.context.annotation.internalConfigurationAnnotationProcessor
Set<String> processedBeans = new HashSet<>();
// 判断beanFactory是否为BeanDefinitionRegistry 这边是默认的DefaultListableBeanFactory,所以为true
if (beanFactory instanceof BeanDefinitionRegistry) {
BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
// BeanFactoryPostProcessor 和 BeanDefinitionRegistryPostProcessor
// BeanFactoryPostProcessor beanFactory的后置处理器;
// 在BeanFactory标准初始化之后调用,来定制和修改BeanFactory的内容;所有的bean定义已经保存加载到beanFactory,但是bean的实例还未创建时调用
// BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口 可以对bean的定义进行控制, 后期单独详解
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
// 遍历
for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {
if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
BeanDefinitionRegistryPostProcessor registryProcessor =
(BeanDefinitionRegistryPostProcessor) postProcessor;
// 直接执行BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法
registryProcessor.postProcessBeanDefinitionRegistry(registry);
// 添加到链表最后执行 postProcessBeanFactory 方法
registryProcessors.add(registryProcessor);
} else {
// 直接添加到链表最后执行 postProcessBeanFactory 方法
regularPostProcessors.add(postProcessor);
}
}
// 当前需要执行的BeanDefinitionRegistryPostProcessor的链表
List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>();
// 在当前容器中找到所有实现BeanDefinitionRegistryPostProcessor接口类的全限定名
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
// 这里是通过容器来创建BeanDefinitionRegistryPostProcessor的实现类
for (String ppName : postProcessorNames) {
// 是否实现了PriorityOrdered接口
if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
// 这里getBean 会创建bean实例,后续笔者会进行每个组件详解,这里就理解 如果到容器中拿数据,没有就进行创建
currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
processedBeans.add(ppName);
}
}
// 进行排序(根据是否实现PriorityOrdered、Ordered接口和order值来排序), 是为了我们开发者控制执行流程
sortPostProcessors(currentRegistryProcessors, beanFactory);
// 加入链表 最后进行链式执行
registryProcessors.addAll(currentRegistryProcessors);
// 遍历currentRegistryProcessors, 执行postProcessBeanDefinitionRegistry方法
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
// 清除 便与GC 和 方便后续使用
currentRegistryProcessors.clear();
// 这里是进行二次查找 因为执行过程中 可能会生成新的BeanDefinitionRegistryPostProcessor
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, beanFactory.getApplicationStartup());
currentRegistryProcessors.clear();
// 调用所有剩下的BeanDefinitionRegistryPostProcessors 道理同上
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);
// 如果有新加的 则需要在重新查一遍看是否有新的BeanDefinitionRegistryPostProcessor 产生,所以设置为true。
reiterate = true;
}
}
sortPostProcessors(currentRegistryProcessors, beanFactory);
registryProcessors.addAll(currentRegistryProcessors);
invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup());
currentRegistryProcessors.clear();
}
// 调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法(BeanDefinitionRegistryPostProcessor继承自BeanFactoryPostProcessor)
invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);
// 调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
} else {
invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);
}
// 上面处理入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor 。
// 下面开始处理容器中的所有BeanFactoryPostProcessor 其实流程都大同小异。上面的懂了 下面也就好明白了。所以就不在注释
String[] postProcessorNames =
beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
List<String> orderedPostProcessorNames = new ArrayList<>();
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
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);
}
}
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
for (String postProcessorName : orderedPostProcessorNames) {
orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
sortPostProcessors(orderedPostProcessors, beanFactory);
invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String postProcessorName : nonOrderedPostProcessorNames) {
nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
}
invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
// 这里清楚元数据缓存, 因为在上述处理过程中 可能修改了元数据。
beanFactory.clearMetadataCache();
}
protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);
}
3.1 org.springframework.context.support.PostProcessorRegistrationDelegate#registerBeanPostProcessors()
这个方法和上面的注册BeanFactoryPostProcessor的思想是一致的
public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
// 找出所有实现BeanPostProcessor接口的类全限定名
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
// 计数
int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
// BeanPostProcessorChecker 这个类主要用于记录数据, 也实现了eanPostProcessor。
beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
// 这里分为多个list 是为了区分实现不同的接口的BeanPostProcessor的实现类
// 但是值得注意的是 注册到容器中的后置处理器链表时都是一个list 我个人理解这样对于排序和后续的遍历处理都比较方便,更优雅。
// 实现PriorityOrdered接口
List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
// Spring内部的BeanPostProcessor
List<BeanPostProcessor> internalPostProcessors = new ArrayList<>();
// 实现Ordered接口的BeanPostProcessor的beanName
List<String> orderedPostProcessorNames = new ArrayList<>();
// 普通BeanPostProcessor的beanName
List<String> nonOrderedPostProcessorNames = new ArrayList<>();
for (String ppName : postProcessorNames) {
// 这里就是判断不同的BeanPostProcessor
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);
}
}
// priorityOrderedPostProcessors进行排序 然后注册到容器中
sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, priorityOrderedPostProcessors);
// 非内置的这个时候还没有被初始化 所以需要getBean去创建。
List<BeanPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());
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);
List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());
for (String ppName : nonOrderedPostProcessorNames) {
BeanPostProcessor pp = beanFactory.getBean(ppName, BeanPostProcessor.class);
nonOrderedPostProcessors.add(pp);
if (pp instanceof MergedBeanDefinitionPostProcessor) {
internalPostProcessors.add(pp);
}
}
// 注册常规的BeanPostProcessors 这种是开发人员没有进行排序的后置处理器 不是说不进行排序
registerBeanPostProcessors(beanFactory, nonOrderedPostProcessors);
// 重新注册内置处理器, 为了移动到后置处理器链表尾部
sortPostProcessors(internalPostProcessors, beanFactory);
registerBeanPostProcessors(beanFactory, internalPostProcessors);
// 重新注册 同上 因为注册时会先删除再add.
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
}
protected void initApplicationEventMulticaster() {
ConfigurableListableBeanFactory beanFactory = getBeanFactory();
// 判断容器中是否有名称为applicationEventMulticaster的bean定义信息。
if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
// 如果有就进行创建 然后赋值成员变量applicationEventMulticaster
this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
if (logger.isTraceEnabled()) {
logger.trace("Using ApplicationEventMulticaster [" + this.applicationEventMulticaster + "]");
}
} else {
// 如果没有,则默认采用SimpleApplicationEventMulticaster
this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
// 将该对象注入bean工厂
// beanName 映射等操作
beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
if (logger.isTraceEnabled()) {
logger.trace("No '" + APPLICATION_EVENT_MULTICASTER_BEAN_NAME + "' bean, using " +
"[" + this.applicationEventMulticaster.getClass().getSimpleName() + "]");
}
}
}
protected void registerListeners() {
// getApplicationListeners() 获取applicationListeners属性
// 保存所有实现ApplicationListener的类实例
// 然后把实例通过org.springframework.context.event.AbstractApplicationEventMulticaster#addApplicationListener 添加到容器中进行保存
for (ApplicationListener<?> listener : getApplicationListeners()) {
getApplicationEventMulticaster().addApplicationListener(listener);
}
// 从容器注册表中获取获取未实例化的监听器 第三方jar 和我们自定义的
// getBeanNamesForType该方法其实是把Class转换然后通过Spring容器的映射集合中获取beanName。
String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
for (String listenerBeanName : listenerBeanNames) {
// 注册 org.springframework.context.event.AbstractApplicationEventMulticaster.DefaultListenerRetriever#applicationListenerBeans 属性上,供后续使用。
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
}
// 这里会异步执行早期的广播事件,如果存在的话
// 这里其实就是Spring容器中哪个阶段的事件进行执行
Set<ApplicationEvent> earlyEventsToProcess = this.earlyApplicationEvents;
// 只执行一次。其实这里还能反应一个代码技巧,就是提前把成员变量的属性置空。避免其它地方使用到,或者后续出现错误使用,改为局部变量使用。
this.earlyApplicationEvents = null;
if (!CollectionUtils.isEmpty(earlyEventsToProcess)) {
for (ApplicationEvent earlyEvent : earlyEventsToProcess) {
// 获取监听器注册表 然后调用 multicastEvent()方法
// org.springframework.context.event.SimpleApplicationEventMulticaster#multicastEvent(org.springframework.context.ApplicationEvent, org.springframework.core.ResolvableType)
// 这个方法会进行异步调用,然后获取所有当前事件(earlyEvent)关联的listener
// 然后遍历list调用每个监听器的onApplicationEvent()方法。
getApplicationEventMulticaster().multicastEvent(earlyEvent);
}
}
}
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
// 初始化此上下文的转换服务
if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) &&
beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
beanFactory.setConversionService(
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
}
// 如果beanFactory之前没有注册嵌入值解析器,则注册默认的嵌入值解析器:主要用于注解属性值的解析。
if (!beanFactory.hasEmbeddedValueResolver()) {
beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));
}
// api https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/weaving/LoadTimeWeaverAware.html
// 这里我理解就是为了感知加载时间的
String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
for (String weaverAwareName : weaverAwareNames) {
getBean(weaverAwareName);
}
// Stop using the temporary ClassLoader for type matching.
beanFactory.setTempClassLoader(null);
// 冻结所有bean定义,注册的bean定义不会被修改或进一步后处理,因为马上要创建 Bean 实例对象了 相当于锁
beanFactory.freezeConfiguration();
// 实例剩下所有非懒加载bean
beanFactory.preInstantiateSingletons();
}
6.1 org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons
当前方法会实例化所有的非懒加载的bean,
主要就是循环beanDefinitionNames
通过getBean进行实例化和初始化过程,从而进行ioc和aop增强。
public void preInstantiateSingletons() throws BeansException {
// 拿到所有的bean定义信息注册表中的所有bean名称(是在注册bean定义信息映射保存的beanName)
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
for (String beanName : beanNames) {
// 遍历 然后获取每一个bd (bean定义信息 下文简称bd)
RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);
// 这里对bean信息的判断,是构造bean定义信息时候设置的
// 是否抽象bean。
// 是否单例bean(非单例的需要在特定的场景进行初始化,比如原型bean每次getBean时候进行创建,requst 每次web请求时候创建, 不注册到容器中,使用完会被回收)
// 是否懒加载 如果懒加载需要在使用的时候判断是否为null, 等于null然后进行创建, 单例的情况会注册到容器中。
if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {
// 是否FactoryBean
if (isFactoryBean(beanName)) {
// 如果是FactoryBean的话 这里需要创建两个bean
// 第一个是FactoryBean 实现类
// 在容器中会加上FACTORY_BEAN_PREFIX 前缀 也就是【&】
// 走getBean流程 进行创建,所以这里也可以依赖自己创建的其它普通bean
// 这里加前缀的beanName 和 beanName 是存放在不同的注册表中的
// FactoryBean 创建的单例bean是缓存在这个地方 org.springframework.beans.factory.support.FactoryBeanRegistrySupport#factoryBeanObjectCache
// 本身则缓存在org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#singletonObjects
Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
// 严谨一些判断 确定创建出来的bean类型
if (bean instanceof FactoryBean) {
FactoryBean<?> factory = (FactoryBean<?>) bean;
// 是否懒加载 这里主要判断是否需要是否立即加载这个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) {
// 这里立即创建
// 这里创建的bean是不带前缀的
// 就是 FactoryBean类 getObject()方法返回的bean实例, 下文详解
getBean(beanName);
}
}
}
else {
// spring管理的普通bean, 进行初始化
getBean(beanName);
}
}
}
// 所有bean的后置初始化回调
for (String beanName : beanNames) {
Object singletonInstance = getSingleton(beanName);
// bean初始化成功后进行初始化方法调用 init 方法 @PostConstruct
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 {
// bean初始化成功后进行初始化方法调用 init 方法 @PostConstruct
smartSingleton.afterSingletonsInstantiated();
}
smartInitialize.end();
}
}
}
6.1.1 org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
Spring容器创建bean的核心方法 流程是getBean -> doGetBean -> createBean -> doCreateBean.
这里将会进行依赖注入,AOP类增强, 解决循环依赖
@Override
public Object getBean(String name) throws BeansException {
// 参数1beanName
// 参数2 doGetBean是返回泛型 我们在使用的时候可以 context.getBean(MyBean.class)
// 参数3 构造实例bean 需要的参数
// 参数4 是否需要类型检查 这里是不需要
return doGetBean(name, null, null, false);
}
protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
// 如果包含【&】前缀就去除
// 如果是别名就转换成类路径+类名称(全限定名)
String beanName = transformedBeanName(name);
Object beanInstance;
// 缓存中是否存在 就是到缓存map里面拿已经实例化的bean
// getSingleton() 这个方法会涉及到循环依赖问题,三级缓存进行解决,后续文章进行详细讲解
Object sharedInstance = getSingleton(beanName);
// 第一次sharedInstance一定是等于null的
// 那么这里为啥会把sharedInstance != null放在前面呢?
// 我觉得Spring作者很细节, 因为大多数情况下 我们使用容器getBean()时,大多数时候都进行创建了,这样可以更好的执行相对应的代码(个人理解),bean只会创建一次,读大于写。
if (sharedInstance != null && args == null) {
// 这里等于说非第一次创建
// 【getObjectForBeanInstance】 判断当前Bean是不是FactoryBean
// 如果是 就需要判断是想获取FactoryBean 还是调用 FactoryBean.getOBject() 方法
// 这个时候就会判断传入的beanName,如果加上了【&】,就说明想要返回FactoryBean 那么这里就返回 FactoryBean
// 如果没有 就先去看缓存里面有没有 org.springframework.beans.factory.support.FactoryBeanRegistrySupport#factoryBeanObjectCache
// 如果没有再调用getObject();
// 最终调用 org.springframework.beans.factory.support.FactoryBeanRegistrySupport#postProcessObjectFromFactoryBean 进行增强, 所以我们扩展第三方插件bean 就可以扩展这个
beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, null);
} else {
// 判断是否循环依赖
// 例如原型bean的循环依赖、单例bean 构造器参数循环依赖 。
if (isPrototypeCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(beanName);
}
// parentBeanFactory 属性 是否有父容器, 父容器是否包含 类似双亲委派
BeanFactory parentBeanFactory = getParentBeanFactory();
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) {
// 包含args参数时
return (T) parentBeanFactory.getBean(nameToLookup, args);
}
else if (requiredType != null) {
// 非第一次创建时 其实这里理解为 父容器存储这些bean 就好了
return parentBeanFactory.getBean(nameToLookup, requiredType);
}
else {
return (T) parentBeanFactory.getBean(nameToLookup);
}
}
// 不需要检查类型时, 标记bean正在创建
if (!typeCheckOnly) {
markBeanAsCreated(beanName);
}
StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate")
.tag("beanName", name);
try {
if (requiredType != null) {
beanCreation.tag("beanType", requiredType::toString);
}
// 获取并合并bean定义信息
//判断是否有parentBean,
// 如果有的话,会根据parentBeanName再次调用getMergedBeanDefinition方法,
// 如果所有的bean生产都在此方法中生产的话,这里是一次递归调用,也就是要生产bean,先生成他的父bean的BeanDefinition,
// 注意,此处如果beanName和parentBeanName相同,会判断在DefaultListableBeanFactory时候设定的ParentBeanFactory是否ConfigurableBeanFactory的实例,
// 如果是,采用它来生产父bean的配置,产生后将子bean的BeanDefinition通过overwriteForm到父bean,也就是覆盖了父bean相同的配置
RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
checkMergedBeanDefinition(mbd, beanName, args);
// @dependsOn 当前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 + "'");
}
// 注册bean的依赖关系, 就是对于beanName的定义信息添加依赖的bean属性
registerDependentBean(dep, beanName);
try {
// 创建依赖的bean
getBean(dep);
}
catch (NoSuchBeanDefinitionException ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
}
}
}
// 如果是单例 这里就开始创建了 核心方法
if (mbd.isSingleton()) {
// 创建bean 入参函数式接口ObjectFactory
// 然后调用ObjectFactory的getObject()方法,
// getObject()方法的实现就是下面{}中的createBean()方法
sharedInstance = getSingleton(beanName, () -> {
try {
return createBean(beanName, mbd, args);
} catch (BeansException ex) {
destroySingleton(beanName);
throw ex;
}
});
// 是否是FactoryBean同上讲解。
beanInstance = 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);
}
beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
}
// 其它类型 比如session request。
else {
String scopeName = mbd.getScope();
if (!StringUtils.hasLength(scopeName)) {
throw new IllegalStateException("No scope name defined for bean '" + beanName + "'");
}
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);
}
});
beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
}
catch (IllegalStateException ex) {
throw new ScopeNotActiveException(beanName, scopeName, ex);
}
}
}
catch (BeansException ex) {
beanCreation.tag("exception", ex.getClass().toString());
beanCreation.tag("message", String.valueOf(ex.getMessage()));
cleanupAfterBeanCreationFailure(beanName);
throw ex;
}
finally {
beanCreation.end();
}
}
// 类型转换于检查
return adaptBeanInstance(name, beanInstance, requiredType);
}
6.1.1.2 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton()
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(beanName, "Bean name must not be null");
// 创建bean的时候进行锁定整个注册表
synchronized (this.singletonObjects) {
// 是否已经创建
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
// 如果是已经注销的bean就报错。
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为创建状态, 如果已经是的 说明循环依赖
// 抛出异常 Requested bean is currently in creation: Is there an unresolvable circular reference?
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) {
// Has the singleton object implicitly appeared in the meantime ->
// if yes, proceed with it since the exception indicates that state.
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;
}
// 清除创建状态
afterSingletonCreation(beanName);
}
if (newSingleton) {
// 这里对三级缓存进行处理
// 添加到最终的 singletonObjects
// 移除 singletonFactories、earlySingletonObjects
// 添加到registeredSingletons
addSingleton(beanName, singletonObject);
}
}
return singletonObject;
}
}
6.1.1.3 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean()
protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
if (logger.isTraceEnabled()) {
logger.trace("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// resolveBeanClass方法解析加载了mbd但是并没有生产Bean,它会生产一个特定的classLoad来加载mbd生成class
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
// 判断了是否是动态解析的bean和是否是共享合并的bean,在这种情况下mbd是无法储存的解析出来class的,所以这里克隆一下mbd对象。
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// 准备覆盖的方法
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
。。。。。
}
try {
//
// 这里可以返回一个代理类 而不是返回实际对象
// 如果有实现InstantiationAwareBeanPostProcessor的 postProcessBeforeInstantiation方法并且这个方法返回一个对象而不是空的情况下的话
// 就会调用实现了BeanPostProcessor的实例类的后置方法postProcessAfterInitialization 进行类增强
// 这是就是spring中著名的狸猫换太子!!!
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
。。。。。
}
try {
// 如果上面没有进行替换成功,那么就走真正的创建bean流程 下文详解
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isTraceEnabled()) {
logger.trace("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
。。。。。
}
catch (Throwable ex) {
。。。。。
}
}
6.1.1.3 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean()
protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
throws BeanCreationException {
// bean的包装类
BeanWrapper instanceWrapper = null;
// 是否单例
if (mbd.isSingleton()) {
// 缓存清楚 第一次实例化的时候 没有值。
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
}
if (instanceWrapper == null) {
// 开始创建 下文讲解
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// 得到实际创建的bean.
Object bean = instanceWrapper.getWrappedInstance();
Class<?> beanType = instanceWrapper.getWrappedClass();
if (beanType != NullBean.class) {
// 将解析类型 设置 为 beanType
mbd.resolvedTargetType = beanType;
}
// Allow post-processors to modify the merged bean definition.
synchronized (mbd.postProcessingLock) {
if (!mbd.postProcessed) {
try {
// 对bean定义修改,主要是实现了MergedBeanDefinitionPostProcessor接口的对象, 循环调用,然后修改bean定义信息,也可以自定义扩展
// spring 默认的实现会处理一些注解等 @Value、@Autowire
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"Post-processing of merged bean definition failed", ex);
}
mbd.postProcessed = true;
}
}
//判断是否需要提前曝光, 这里可以参考一些网上讲的spring循环依赖如何解决的
// 后续文章对循环依赖进行分析
boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
isSingletonCurrentlyInCreation(beanName));
if (earlySingletonExposure) {
if (logger.isTraceEnabled()) {
logger.trace("Eagerly caching bean '" + beanName +
"' to allow for resolving potential circular references");
}
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
// bean 实例化成功, 下面开始进行初始化.
Object exposedObject = bean;
try {
// 对bean进行填充,将各个属性值注入,其中可能存在依赖于其他bean的属性,会递归初始化
populateBean(beanName, mbd, instanceWrapper);
// 第一步调用invokeAwareMethods(beanName, bean); 如果该bean实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware 则进行调用对应方法
// 第二步循环调用是spring容器种BeanPostProcessor链表种实现类的postProcessBeforeInitialization方法
// 第三步invokeInitMethods(beanName, wrappedBean, mbd); 这里就是调用bean实例化后需要调用的init方法。比如是实现了 InitializingBean的bean
// 最后循环调用是spring容器种BeanPostProcessor链表种实现类的postProcessAfterInitialization方法对类进行增强
// AOP 就是这一步实现的
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);
}
}
if (earlySingletonExposure) {
Object earlySingletonReference = getSingleton(beanName, false);
// earlySingletonReference 只有在检测到有循环依赖的情况下才会不为空
if (earlySingletonReference != null) {
if (exposedObject == bean) {
//如果exposedObject 没有在初始化方法中被改变,也就是没有被增强 就直接赋值缓存中的对象引用
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);
}
}
// actualDependentBeans依赖的对象
// 如果这个时候还有依赖的对象未被创建,说明循环依赖或者其它问题,比如找不到类啥的。这个时候程序需要终止报错。
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 " +
"'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
}
}
}
}
// Register bean as disposable.
try {
// 注册到 disposableBeans 里面,便于后续销毁bean执行特定的方法
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
catch (BeanDefinitionValidationException ex) {
。。。。
}
return exposedObject;
}
这个时候容器已经启动成功了,执行容器启动后的一些操作
调用publishEvent(new ContextRefreshedEvent(this)),发出 ContextRefreshEvent 通知,
调用调用lifecycleProcessor的刷新方法,通知生命周期处理器 lifecycleProcessor 刷新过程。
protected void finishRefresh() {
// 清除上下文级资源缓存(例如ASM元数据)。
clearResourceCaches();
// 实例化或初始化lifecycleProcessor 然后进行调用
// 1. 先判断是否有名称为lifecycleProcessor的bean定义信息,有就走getBean创建
// 2. 如果没有就创建默认的DefaultLifecycleProcessor 然后注册到容器中去
initLifecycleProcessor();
// 调用lifecycleProcessor的刷新方法
getLifecycleProcessor().onRefresh();
// 发布ContextRefreshedEvent事件,告诉其监听器,容器已经启动成功,可以做一些相关的操作
publishEvent(new ContextRefreshedEvent(this));
// 注册MBean,用于JMX管理
// 是否注册了运行是调用 判断方法 (System.getProperty("org.graalvm.nativeimage.imagecode") != null);
if (!NativeDetector.inNativeImage()) {
LiveBeansView.registerApplicationContext(this);
}
}
【refresh()】小结:主要完成bean的创建 IOC、AOP、以及各个阶段事件的发布订阅。这块是Spring种最复杂的地方,里面还有很多方面没有分析到,后续划分成小模块进行分析。
这里笔者说下自己的理解: 在看spring源码过程中,你可以这样理解: 容器就好像一个数据库. 核心是bean定义信息和bean实例注册表,把这两个想象成两张表,然后同时需要保存各种关联表(各种list和Map)在需要的时候通过特定的方法进行读取和使用,然后就是分层去看源码,读取、创建、获取。
【总结】Spring容器初始化已经完成,笔者通过一条线尽可能把自己了解的进行讲解(这里对笔者也是很大的考验’虽然写的很不好’),但是Spring远远不止这些,希望大家多去研究,对源码有更深的研究,同时也能提升自己,在工作中更加得心应手。如果希望和笔者共同探讨Spring源码可以关注公众号【Code视角】