Spring源码解析-构造函数

Spring源码之bean的实例化createBeanInstance方法解读 目录前言 前言 这篇文章是 IOC 容器初始化启动时,抽象类 AbstractAutowireCapableBeanFactory 的 doCreateBean() 方法里面的 createBeanInstance() 方法,顾名思义是 bean 的实例化方法。 阅读本篇文章,同时可以参考阅读 spring源码之getBean(获取 bean)方法解读(二) 和 spring aop代理对象的产生(一) 这两篇文章的 doCreateBean() 方法 ... 阅读详情

1、构造函数概述

构造函数中,主要创建两个对象分别用来读取注解参数和classpath下的文件

  • AnnotatedBeanDefinitionReader 专门读取注解参数的Reader

  • ClassPathBeanDefinitionScanner 专门读取classpath下的文件,例如yml、properties等。

AnnotationConfigApplicationContext 可以通过扫描指定的包或类来自动检测和注册带有特定注解的组件,例如@Service、@Repository和@Controller等。使用AnnotationConfigApplicationContext,我们可以使用注解来配置和管理Spring应用程序的各种组件,而不需要显式地在XML配置文件中进行配置。这样可以简化配置过程并提高开发效率。

1.1 构造器源码
public AnnotationConfigApplicationContext() {
    StartupStep createAnnotatedBeanDefReader = this.getApplicationStartup().start("spring.context.annotated-bean-reader.create");
    this.reader = new AnnotatedBeanDefinitionReader(this);
    createAnnotatedBeanDefReader.end();
    this.scanner = new ClassPathBeanDefinitionScanner(this);
}

主要的代码在this.reader和this.sanner。

1.2 继承关系

总览继承关系:

从继承关系来看,AnnotationConfigApplicationContext 继承 GenericApplicationContext 类,GenericApplicationContext 又实现了BeanDefinitionRegistry 接口,所以AnnotationConfigApplicationContext 本身就具备了BeanDefinitionRegistry 的功能。其他的关系也可以从上图中看出.

总结一些主要的特性:

  • AnnotationConfigApplicationContext 是一个 BeanDefinitionRegistry 注册器。

  • AnnotationConfigApplicationContext 是一个ConfigurableApplicationContext上下文配置的容器

  • AnnotationConfigApplicationContext 继承GenericApplicationContext,DefaultListableBeanFactory是GenericApplicationContext的一个final属性。

2、AnnotatedBeanDefinitionReader注解读取器

AnnotatedBeanDefinitionReader 构造函数:

public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
    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);
}

从构造函数可以看出是在需要传递一个Bean定义对象的注解器BeanDefinitionRegistry,这个register就是AnnotationConfigApplicationContext。

构造函数中主要做了两件事情,创建条件解析器以及注解注解配置处理器

  • this.conditionEvaluator 条件解析器,主要针对Conditional.class

  • AnnotationConfigUtils.registerAnnotationConfigProcessors 注册注解配置处理器

2.1 条件解析器this.conditionEvaluator

ConditionEvaluator用于在运行时评估条件表达式。它的主要作用是根据条件表达式的结果来决定是否应该创建或注册某个Bean。

在Spring中,我们可以使用条件注解(如@Conditional)来根据条件来决定是否应该创建或注册某个Bean。ConditionEvaluator就是用于解析和评估这些条件表达式的。

ConditionEvaluator 的构造器仅仅是new了一个ConditionContextImpl, 且ConditionContextImpl是ConditionEvaluator的内部类。

这个不是本章节的重点,有兴趣的笔友可以深入研究。

2.2 注册注解配置处理器
    再了解`AnnotationConfigUtils.registerAnnotationConfigProcessors`方法之前,我们先看`AnnotationConfigUtils`都给我们提供了那些方法。

注解9.png

AnnotationConfigUtils提供了公用定义的注解的处理、注册注解后置处理器、注解后置处理器以及一些常量。这些常量也是公用内置的公用类。常量如下:

  • org.springframework.context.annotation.internalConfigurationAnnotationProcessor

  • org.springframework.context.annotation.internalConfigurationBeanNameGenerator

  • org.springframework.context.annotation.internalAutowiredAnnotationProcessor

  • org.springframework.context.annotation.internalRequiredAnnotationProcessor(已过时)

  • org.springframework.context.annotation.internalCommonAnnotationProcessor

  • org.springframework.context.annotation.internalPersistenceAnnotationProcessor

  • org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor

  • org.springframework.context.event.internalEventListenerProcessor

  • org.springframework.context.event.internalEventListenerFactory

从命名可以看出,大部分的类都是以internal 开头的。这个都是解析注解所必要的内部使用的类,不对外暴露的类。

2.3 来研究具体的注册注解处理器的方法

源码

public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
    registerAnnotationConfigProcessors(registry, null);
}

public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(
            BeanDefinitionRegistry registry, @Nullable Object source) { 
    DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
    // ......
    Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
    // ......
    return beanDefs;
}

从源码来看,注册注解处理器调用重载方法registerAnnotationConfigProcessors( BeanDefinitionRegistry registry, @Nullable Object source)

2.3.1 源码(1)
DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);
if (beanFactory != null) {
    if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {
        beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);
    }
    if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {
        beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());
    }
}

拆解registry是不是DefaultListableBeanFactory Bean工厂,如果是就会设置属性,如果不是,则会忽略。 由于上面1.2继承关系的分析,我们知道当前的registry继承自GenericApplicationContext。

private static DefaultListableBeanFactory unwrapDefaultListableBeanFactory(BeanDefinitionRegistry registry) {
    if (registry instanceof DefaultListableBeanFactory) {
        return (DefaultListableBeanFactory) registry;
    }
    else if (registry instanceof GenericApplicationContext) {
        return ((GenericApplicationContext) registry).getDefaultListableBeanFactory();
    }
    else {
        return null;
    }
}

所以我们必然可以得到一个DefaultListableBeanFactory对象。

接下来,就是给beanFactory 设置属性,根据是否满足条件设置对应的属性。

beanFactory.setDependencyComparator() 给BeanFactory设置依赖的比较器,主要用来排序。设置的是AnnotationAwareOrderComparator的单例。

beanFactory.setAutowireCandidateResolver() 给BeanFactory设置候选的解析器,也就new了一个ContextAnnotationAutowireCandidateResolver对象,设置了进去。

ContextAnnotationAutowireCandidateResolver对象的父类QualifierAnnotationAutowireCandidateResolver的构造器中添加了对Qualifier.class的支持,私有方法中又包含Value.class,所以注解注入的解析器可以处理两个注解:

  • @Qualifier 与@Autowired配合使用,按照名称注入

  • @Value 源码中通过 findValue() 解析

    总结一下,beanFactory设置以上两个属性,让beanFactory具备了使用比较器、以及解析@Qualifier、@Value 的能力。

2.3.2 源码(2)
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);

if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
    RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
    def.setSource(source);
    beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));
}

if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {
    RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);
    def.setSource(source);
    beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));
}
// ......
    因为我们之前调用的方法是`registerAnnotationConfigProcessors`,没有返回值。所以我们没有必要关心`beanDefs.add()`的结果。只需要关注`registerPostProcessor()` 这个方法即可。

    接下来的源码大致的含义就是判断`register` 中是否包含某些`BeanDefinition`,如果不存在就会注册到`register`中。也就是`register`中一定会有这些`BeanDefinition`。
  • org.springframework.context.annotation.internalConfigurationAnnotationProcessor

    • 对应ConfigurationClassPostProcessor.class,主要用来处理@Configuration类
  • org.springframework.context.annotation.internalAutowiredAnnotationProcessor

    • 对应AutowiredAnnotationBeanPostProcessor.class 主要用来处理@Autowired和@Value,还支持JSR-330de @Inject注解,可以替代@Autowired。
  • org.springframework.context.annotation.internalCommonAnnotationProcessor

    • 对应CommonAnnotationBeanPostProcessor.class,主要用来处理JSR-250的@Resource,以及@PostConstruct、@PreDestroy初始化和销毁注解
  • org.springframework.context.annotation.internalPersistenceAnnotationProcessor

    • 其实加载的是org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor类,注解检查对JPA的支持。
  • org.springframework.context.event.internalEventListenerProcessor

    • 对应EventListenerMethodProcessor.class类,主要处理 ApplicationListener 的实例,也就是Spring的事件驱动的模型。
  • org.springframework.context.event.internalEventListenerFactory

    • 对应DefaultEventListenerFactory.class类,支持@EventListener纾解的一个默认实现

总结一下,通过一系列的设置可以处理的注解包括:

  • @Configuration

  • @Resource

  • @Autowired

  • @Inject

  • @PostConstruct

  • @PreDestroy

  • @Value

  • @EventListener

3、ClassPathBeanDefinitionScanner 扫描器

ClassPathBeanDefinitionScanner 构造函数

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) {
    this(registry, true);
}

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters) {
        this(registry, useDefaultFilters, getOrCreateEnvironment(registry));
}

public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters,
            Environment environment) {

    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;

    if (useDefaultFilters) {
        registerDefaultFilters();
    }
    setEnvironment(environment);
    setResourceLoader(resourceLoader);
}

该构造函数有不同参数的重载。最终主要的是三个方法:

  • registerDefaultFilters() 注册默认的过滤器

  • setEnvironment(environment) 设置运行环境

  • setResourceLoader(resourceLoader) 设置resource资源的加载器

3.1 注册默认的过滤器
    从上面的构造函数看,默认传递的`useDefaultFilters` 参数为true,也就是`registerDefaultFilters()` 一定会执行。

    注册默认的注解过滤器,处理`@Component`,以及具有`@Component`元注解的扩展注解,如`@Service`、`@Controller`、`@respository`.

    如果支持Java EE 6的`@ManagedBean`以及JSR-330的`@Named` 注解。

源码如下:

protected void registerDefaultFilters() {
    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.
    }
}
3.2 设置运行的环境

从ClassPathBeanDefinitionScanner 构造函数可知,获取环境的方法是:getOrCreateEnvironment(registry)

源码如下:

private static Environment getOrCreateEnvironment(BeanDefinitionRegistry registry) {
	Assert.notNull(registry, "BeanDefinitionRegistry must not be null");
	if (registry instanceof EnvironmentCapable) {
		return ((EnvironmentCapable) registry).getEnvironment();
	}
	return new StandardEnvironment();
}

如果registry 具备环境的能力,也就是实现EnvironmentCapable,就直接返回环境,如果没有,就直接创建标椎的环境。

设置环境很简单,就是简单的赋值。

public void setEnvironment(Environment environment) {
	Assert.notNull(environment, "Environment must not be null");
	this.environment = environment;
	this.conditionEvaluator = null;
}
3.3 设置资源加载器
public void setResourceLoader(@Nullable ResourceLoader resourceLoader) {
	this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
	this.metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader);
	this.componentsIndex = CandidateComponentsIndexLoader.loadIndex(this.resourcePatternResolver.getClassLoader());
}

从传递参数来看,resourceLoader是通过register强制转化过来的。

this(registry, useDefaultFilters, environment,
				(registry instanceof ResourceLoader ? (ResourceLoader) registry : null));

我们的registry是间接实现ResourceLoader接口的,所以resourceLoader 也是registry本身。

主要设置是三个属性:

  • this.resourcePatternResolver

  • this.metadataReaderFactory

  • this.componentsIndex

3.3.1 设置资源正则解析器

this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);

源码:

public static ResourcePatternResolver getResourcePatternResolver(@Nullable ResourceLoader resourceLoader) {
	if (resourceLoader instanceof ResourcePatternResolver) {
		return (ResourcePatternResolver) resourceLoader;
	}
	else if (resourceLoader != null) {
		return new PathMatchingResourcePatternResolver(resourceLoader);
	}
	else {
		return new PathMatchingResourcePatternResolver();
	}
}

根据逻辑,返回的是new的PathMatchingResourcePatternResolver对象。解析项目中的资源文件,如xml等

3.3.2 设置原数据读取的工厂

this.metadataReaderFactory = new CachingMetadataReaderFactory(resourceLoader);

源码:

public CachingMetadataReaderFactory(@Nullable ResourceLoader resourceLoader) {
	super(resourceLoader);
	if (resourceLoader instanceof DefaultResourceLoader) {
		this.metadataReaderCache =
				((DefaultResourceLoader) resourceLoader).getResourceCache(MetadataReader.class);
	}
	else {
		setCacheLimit(DEFAULT_CACHE_LIMIT);
	}
}

CachingMetadataReaderFactory的父类是SimpleMetadataReaderFactory,为元数据的读取设置缓存。

3.3.3 设置候选的Component的索引

this.componentsIndex = CandidateComponentsIndexLoader.loadIndex(this.resourcePatternResolver.getClassLoader());

源码:

public static CandidateComponentsIndex loadIndex(@Nullable ClassLoader classLoader) {
	ClassLoader classLoaderToUse = classLoader;
	if (classLoaderToUse == null) {
		classLoaderToUse = CandidateComponentsIndexLoader.class.getClassLoader();
	}
	return cache.computeIfAbsent(classLoaderToUse, CandidateComponentsIndexLoader::doLoadIndex);
}

其中CandidateComponentsIndexLoader::doLoadIndex 会加载META-INF/spring.components 下的URL。

4、小结

构造函数中主要设置了两个东西,一个是处理注解的解析器以及扫描Bean定义的解析器。

注解解析处理的注解包括:

  • @Configuration

  • @Resource

  • @Autowired

  • @Inject

  • @PostConstruct

  • @PreDestroy

  • @Value

  • @EventListener

  • @Qualifier

    Classpath的扫描器可以处理的注解

  • @Service

  • @Controller

  • @Respository

  • @ManagedBean

  • @Named

  • @Component

源码深度解析Spring Bean的创建,手把手的一步一步带你看源码 此处方法设置得十分巧妙, 巧妙之处是Spring将一部分的方法匹配工作在这里完成, 如果当前类职工的方法只有一个的时候就设置重载方法没有被重载,这样在后续被调用的时候就可以直接使用功能此方法,从而不需要进行方法的参数匹配验证,还可以提前对方法存在性进行验证.然后: 解析构造函数并进行构造函数的实例化.因为一个bean对应的类中可能会有多个构造函数,而每个构造函数的参数不同,Spring 在根据参数及类型去判断最终会使用哪个构造函数进行实例化. 阅读详情

相关推荐

Spring源码解析(?)Spring使用构造函数实例分析

.

石臻说AI(szzdzhp001) 【原名 石臻臻的杂货铺】 788

构造函数讲解

我们调用某一个类中的方法时,SysController.方法 。但是这个SysController 并不是类上的SysController 而是构造函数上的SysController,默认为public ,改为private 目的是为了不允许别的类中在new 这个SysController。 ...

weixin_41987908的博客 835

使用Springboot注入带参数的构造函数实例

主要介绍了使用Springboot注入带参数的构造函数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

Lombok常用注解

简介 Lombok是一个通过注解以达到减少代码的Java工具,如通过注解的方式减少get,set方法,构造方法等。 在集成开发工具中使用lombok,首先需要先安装插件: Lombok对应的Maven信息: <dependency> <groupId>org.projectlombok</groupId> <artifactId&gt...

哈 1万+

Word论文插入带有方括号序号的参考文献——尾注+交叉引用

文章目录1. 尾注功能2. 为参考文献的序号添加方括号3. 调整参考文献前的序号大小4. 重复引用同一参考文献5. 将交叉引用的序号改为带有方括号的上标序号格式6. 删除参考文献前的尾注横线 1. 尾注功能 首先使用尾注功能顺序插入参考文献,暂时不考虑方括号问题,具体操作如下: ① 将光标放在需要插入参考文献角标的地方 ② 在word菜单栏,“引用-脚注部分右下角箭头”(用来设置尾注格式) ③如...

Your_Raymond的博客 9万+

三种 绘制奈奎斯特曲线 的方法

如何绘制Nyquist曲线 提供三种绘制方法,其中使用最广泛的是概略图绘制方法 ①解析法绘制 ②概略图法绘制 ③MATLAB绘制

weixin_46664967的博客 6万+

Spring注入详解(构造函数,set,注解)

Spring注入详解 什么是spring注入? 能注入的数据: 基本类型和String 其他bean类型(能够有效读取到的bean,在配置文件或者注解标识过) 复杂类型和集合类型 注入方式 使用构造函数提供 使用set 方法提供 使用注解提供 依赖注入(Dependency Injection) IOC 会降低程序之间的耦合,但是也不是说就没有依赖关系,而这个关系就交给了spring 来进行管理和维护, ...

qq_42521864的博客 1897

触摸屏蓝牙控制

使用杰理芯片通过蓝牙实现触摸屏功能,需要结合触摸屏数据采集、蓝牙数据传输以及移动端应用的实现。

m0_46145044的博客 1111

构造函数详解

当涉及C++中的类和对象时,构造函数是一种特殊的成员函数,用于初始化类的对象。它在对象创建时自动调用,并设置对象的初始状态。在这里,我将详细解释构造函数、explicit 关键字以及初始化列表,并提供相关的代码示例。构造函数是一种特殊类型的成员函数,其名称与类名相同,没有返回类型(包括 void)。它在创建对象时自动调用,用于初始化对象的数据成员和执行其他必要的初始化操作。初始化列表是在构造函数的定义中使用的一种特殊语法,它允许在构造函数体执行之前初始化类的数据成员。

wtswts1232的博客 273

【GNSS测试技术(一)】GNSS基础原理介绍

GNSS(全球卫星导航系统)是一种基于卫星信号的定位技术,通过使用分布在地球轨道上的卫星,为用户提供全球范围内的定位、导航和授时服务。

新猿异码的博客 5758

一次点击跑通:用 Postman 自动获取并携带 CSRF token,测试 SAP OData 写操作

SAP OData 写操作自动化测试方案 针对 SAP Gateway OData 服务写操作中常见的 CSRF token 验证问题,本文提出了一套基于 Postman 的自动化解决方案: 问题分析:解释了 CSRF token 的验证机制及其必要性,说明手工测试效率低下的原因 解决方案: 使用 Postman 环境变量存储 token 通过脚本自动获取并传递 token 利用 Collection Runner 实现一键执行 实施步骤: 创建环境变量存储 token 第一个请求获取 token 并存入变

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 310

Spring源码解析——从XmlBeanFactory的构造函数开始看LoadBeanDefinitions

之前的文章聊过ClassPathResource类,通过这个类,我们从classpath加载到了我们的spring配置文件,之后,就开始执行XmlBeanFactory的构造过程了:     public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(

我们的征途是星辰大海 3327

软件可靠性测试与评价

本文系统介绍了软件可靠性工程的核心内容,包括可靠性概念、模型分类、测试方法和评价体系。重点解析了可靠性测试的三大步骤:定义运行剖面、设计测试用例和实施测试收集数据,并以智能安防系统为例说明具体应用。可靠性评价需结合业务场景,通过量化指标(MTBF、失效率等)和模型预测持续优化系统。文章强调可靠性需贯穿软件全生命周期,通过闭环反馈实现持续改进,为关键系统提供质量保障。

moton2017的博客 2050

Spring IoC源码学习:@Autowire 详解

前言 在Spring IoC:createBean 详解(上)中代码块4.5和Spring IoC:createBean详解(下)中代码块1、代码块4的 7.1.1我们遗留了一个解析——@Autowire注解的解析。之所以单独提出来,是因为在我现在接触的项目中,使用 @Autowire注解的比例非常高,可以说基本用过Spring的同学都接触过这个注解,重要性不言而喻。因此,单独拿...

程序员囧辉 8869

YOLOv11改进 - C3k2融合 | C3k2融合细节增强卷积DEConv(Detail-Enhanced Convolution)提升细微特征提取能力

本文介绍了细节增强卷积(DEConv)技术在YOLOv11中的结合应用。DEConv由标准卷积层和多种差异卷积层并行组成,通过计算像素差异和卷积操作增强特征提取能力,还采用重参数化技术简化模型结构。其优势在于能更好捕捉高频信息、保持参数数量不变且降低推理计算成本。我们将DEConv集成进YOLOv11,替换部分模块。

魔改工程师的博客 864

【实战项目开发技术分享】ROS1.0、ROS 2.0和CyberRT开源通信框架对比

随着机器人和自动驾驶技术的飞速发展,开源通信框架在机器人、自动驾驶行业扮演着重要的角色。ROS1.0是一个广泛应用于机器人领域的开源框架,ROS 2.0是其改进版本,而CyberRT是Baidu Apollo自动驾驶平台的通信框架。ROS和ROS 2.0都注重灵活性和共享性,适用于各种机器人应用。CyberRT则专注于实时性和高性能,适用于自动驾驶等对实时性要求较高的场景。选择适合的框架取决于具体应用需求和开发者的偏好。

xiewf的博客 2万+

bean标签的解析及注册(二)解析BeanDefinition

下面从元素解析及信息提取开始,也就是: 1, 2, 3, 我们进一步看步骤AbstractBeanDefinition beanDefinition=parseBeanDefinitionElement(ele,beanName,containingBean)中,对其他属性的解析过程,(我想再次重申一次,查看Spring源码是一个艰苦且枯燥的过程,如果能坚持下来,你

u012291108的博客 3125

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Spring Framework源码解析——AnnotationConfigApplicationContext

AnnotationConfigApplicationContext是 Spring 框架中基于Java 注解配置的实现,它继承自,并实现了对注解(如@Component@Service等)的自动扫描与注册功能。支持基于 Java 配置类()的 Bean 定义;支持组件扫描(Component Scanning);内部使用和;集成 Spring 容器的标准生命周期管理机制。

谷哥的小弟 892

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring IOC原理源码解析(@Autowired原理详解 :标识构造函数)(一 )

@Autowired标识构造函数,指定实例化Bean时使用哪个构造函数,而不是使用默认的构造函数,同时在实例化时对此构造函数涉及的属性赋值

点滴之积 4650

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ClassPathXmlApplicationContext启动源码解析

本文介绍了Spring框架中的ClassPathXmlApplicationContext容器类,它是基于XML配置文件的IoC容器实现。主要内容包括: 基本用法:通过XML文件定义Bean并使用该类加载配置获取Bean实例 构造函数详解: 支持单/多配置文件加载 可指定父容器实现Bean继承 提供手动刷新控制选项 启动流程:从客户端调用到父类构造器逐层初始化的完整过程 该类是Spring传统XML配置方式的核心组件,通过灵活的构造函数和清晰的继承体系,为依赖注入提供了可靠的基础设施。

weixin_51786043的博客 1144

ConstructorResolver.autowireConstructor()源码分析

ConstructorResolver 是 Spring 框架中的一个类,用于解析和选择合适的构造函数来实例化 bean 对象。在 Spring 中,当需要实例化一个 bean 时,需要确定使用哪个构造函数来创建对象。ConstructorResolver 类负责执行这个任务,并选择适合的构造函数。通过使用 ConstructorResolver,Spring 能够智能地选择适合的构造函数来实例化 bean,并进行自动装配,以满足依赖关系。

m0_51571683的博客 1248

Spring源码系列:BeanDefinition载入(中)

Web核心-Servlet Spring源码系列:启动过程 Spring源码系列:容器刷新 Spring源码系列:BeanFactory的创建 Spring源码系列:BeanDefinition源码解析 Spring源码系列:BeanDefinition载入(上) Spring源码系列:BeanDefinition载入(中) Spring源码系列:BeanDefinition载入(下) 上一篇...

weixin_34375233的博客 174

5.Spring

前面已经对 ClassPathXmlApplicationContext 构造函数及设置资源配置路径做了解析,回顾之前的源码。接着来看 Spring 源码的核心执行流程 refresh。

支支吾吾说不上来的博客 200

Spring循环依赖及三级缓存源码解析

本文基于 SpringBoot5.1.8.RELEASE 版本源码解析 Spring IOC源码解析(1) Spring IOC源码解析(2) Spring拓展点及调用顺序总结 目录1. 图例解释说明1. 循环依赖流程图2. 举例说明上图2. 源码解析1. AbstractBeanFactory.doGetBean1.1 getSingleton(beanName) (DefaultSingletonBeanRegistry)(这个我们重点关注)1.2 DefaultSingletonBeanRegi.

Java动物园的专栏 673
上一篇: Spring源码解析-总览
下一篇: SSE 推送技术
智_永无止境
博客等级 码龄10年 803粉丝 406原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智_永无止境

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值