Spring之ScopeMetadata

Spring容器启动流程解析与面试高频考点 Spring框架的核心机制之一是其IoC容器的启动流程,这一过程涉及BeanDefinition加载、依赖注入和生命周期管理等关键技术。理解容器启动原理不仅有助于掌握Spring的设计思想,还能帮助开发者更好地利用其扩展机制进行定制开发。在面试中,容器启动流程是高频考点,因为它能全面考察候选人对Spring核心组件的理解程度。通过分析refresh()方法的12个关键阶段,可以深入理解模板方法模式、观察者模式等设计思想在Spring中的实际应用。对于企业级应用开发,掌握这些原理能有效解决循环依赖、性能优化等 阅读详情

Spring之ScopeMetadata

概述

Spring在注册bean的时候。会通过bean的作用域来决定是否使用代理模式去创建bean。如果是单例模式,那么不会使用代理,非单例就会使用。并且如果这个bean实现了接口,就会使用JDK动态代理,如果继承类,就会使用Cglib代理。
在AnnotatedBeanDefinitionReader方法doRegisterBean中,最后组装BeanDefinitionHolder的时候会决定使用代理方式:

BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
//这里没有做任何修改,即没有选择代理模式
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);

ScopeMetadata

ScopeMetadata部分源码如下:

public class ScopeMetadata {

	private String scopeName = BeanDefinition.SCOPE_SINGLETON;

	private ScopedProxyMode scopedProxyMode = ScopedProxyMode.NO;

scopeName默认是singleton。这个在ConfigurableBeanFactory中作为属性。prototype就是原型模式。非单例。

String SCOPE_SINGLETON = "singleton";
String SCOPE_PROTOTYPE = "prototype";

scopedProxyMode 决定了代理模式使用哪一种方式创建对象。是一个枚举。

ScopedProxyMode

public enum ScopedProxyMode {


	DEFAULT,


	NO,


	INTERFACES,


	TARGET_CLASS

}

DEFAULT是默认的。和NO相等。主要是scopeName=singleton的时候使用。非单例模式使用INTERFACES和TARGET_CLASS。TARGET_CLASS是Cglib代理。INTERFACES是JDK动态代理模式。

SpringIOC之ScopeMetadata 然后,可以将 MyScopeMetadata 配置到 Spring 容器中,以应用于特定的 Bean 或 BeanDefinition。 阅读详情

相关推荐

FPGA实现PI控制

FPGA实现PI控制

m0_57319166的博客 3897

设计模式—结构型—代理模式

为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 角色: 抽象角色:通过接口或抽象类声明真实角色实现的业务方法。 代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 真实角色:实现抽象角色,定义真实角色所要实现的业

路漫漫其修远兮,吾将上下而求索。 444

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

Spring源码分析之Scope注解处理

前言 本文旨在分析在Spring容器启动之时,@Scope注解的处理过程。 处理代码为: ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd); abd.setScope(scopeMetadata.getScopeName()); //进入this.scopeMetadataResolver.resolveScopeMetadata方法 ScopeMetadata resolveSco

研究生生活、学习记录 999

解决Linux下Questasim中代码字体非常小

Questasim的source窗口里代码字体非常小 你是不是也遇到这样的问题,在使用Vmware时,Questasim的代码字体非常小,小到完全看不见,连断点都没办法标记。 下面我给出我摸索好久的解决办法,分享给大家。 1.首先,版本是Questasim 10.7c,在Vmware16中打开,情况如下: 不多逼逼,直接上图开搞: 给textFontV2设置值:monospace 12 normal roman 这里一定要注意啦,点完apply之后,不要点ok,直接关闭窗口。 ...

SummerXRT的博客 7817

gem5 prefetcher

最近在gem5上做预取实验,添加自己的预取算法,这里采用hardware stream prefetcher , 修改了几个bug才给实验调试通过,发文记录下实验过程。 gem5上添加自己的预取算法步骤: (1)路径gem5-master/configs/common/Caches.py下,开启预取:class L1Cache(Cache): assoc = 2 tag_late

编程邦 3846

深入了解Spring的@Scope注解中作用域代理proxyMode属性的实现

一.问题引入 代码如下: @RestController public class ConfigController { @Autowired private TestService testService; @GetMapping("/testPrototype") public String testPrototype() { System.out.println(testService); return testService.

我神级欧文的博客 5058

龙迅LT9611UXC芯片简介:Dual-Port MIPI DSI/CSI to HDMI2.0 with Audio

龙迅半导体推出的LT9611UXC是一款高性能MIPI转HDMI2.0转换器,支持DSI/CSI接口转换,兼容多种视频格式(RGB/YCbCr),最高支持4K@60Hz输出。该芯片集成音频处理(I2S/SPDIF)、色彩空间转换和3D功能,适用于机顶盒、电视盒子等消费电子及车载设备。提供工业级(-40℃~+85℃)和车规级(AEC-Q100认证)版本,采用QFN64封装。

MB16698594834的博客 1334

php || 面向对象编程

属性,方法的调用: 类: <?php class Person{ //定义Person类 //定义两个public公共属性 public $heigh=170; public $money=0; //定义work方法 function work($hours){ re...

weixin_45703155的博客 367

39、信号流图:解决线性代数方程组的图论方法

本文介绍了信号流图理论在求解线性代数方程组中的应用,重点阐述了Coates方法和Mason方法的原理、步骤及对比分析。通过图论视角,将矩阵运算转化为对有向图结构的分析,利用1-因子、1-阶连接、前向路径和反馈回路等概念,推导出方程组解的拓扑公式。文章结合具体实例演示两种方法的计算过程,并总结其在电路分析、控制系统和通信系统等领域的拓展应用,展示了信号流图理论的直观性与有效性。

pear55的博客 88

进阶06:C#连接TwinCAT 3使用ADS通讯

本文介绍了使用C#通过ADS协议与倍福TwinCAT3 PLC通讯的实现方法。主要内容包括:1)在两台电脑上安装TwinCAT3开发环境并建立网络连接;2)在TwinCAT中定义变量和结构体;3)使用C# Winform开发界面,通过TwinCAT.Ads.dll实现读写功能;4)实现主动读取和通知两种数据获取方式。详细说明了连接建立、变量定义、读写操作及事件通知的实现代码。该方案实现了对PLC寄存器数据的实时监控和操作,为工业控制系统的开发提供了参考。

weixin_38637405的博客 3689

spring应用手册-IOC(注解实现)-(30)-@ComponentScan注解的scopeResolver属性

戴着假发的程序员出品 抖音ID:戴着假发的程序员 欢迎关注 @ComponentScan注解的scopeResolver属性 spring应用手册(第二部分) 这里的scopeResolver也是和 context:component-scan的scope-resolver属性完全一致: 注意这个属性和scoped-proxy是互斥的。 这个属性跟name-generator有点类似,它

415

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

spring应用手册-IOC(XML配置实现)-(36)-context:component-scan的scope-resolver属性

戴着假发的程序员出品 context:component-scan的scope-resolver属性 spring应用手册(第一部分) 注意这个属性scope-resolver和scoped-proxy是互斥的。 这个属性跟name-generator有点类似,它是基于接口ScopeMetadataResolver的,实现resolveScopeMetadata方法,目的是为了将@Sco

345

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

老版QQ原生表情gif动态

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

纯手写实现Spring源码框架(三)

上一篇我们完成了Bean定义的加载对象,这次完成scope获取value值写入元数据和设置BeanName scope体系 定义作用域源数据类ScopeMetadata /** * 定义作用域源数据类 */ public class ScopeMetadata { //定义作用域的默认值 private String scopeName = BeanDefinition.SCOPE_SINGLETON; public String getScopeName() {

qq_35059264的博客 297

Spring源码注解启动流程解析(2)

下面解析 register(componentClasses); @Override public void register(Class<?>... componentClasses) { Assert.notEmpty(componentClasses, "At least one component class must be specified"); /** * 这里通过之前无参构造器this()初始化好了AnnotatedBeanDefinitionReader

weixin_42685950的博客 437

【Spring】Bean和BeanDefinition

先来看看java的Class,这个是大家最熟悉的,站在面向对象的角度,万物皆对象,而Class就是用来描述对象的对象。 /* * Private constructor. Only the Java Virtual Machine creates Class objects. * This constructor is not used and prevents the def...

hansirl的博客 259

AnnotationScopeMetadataResolver 解析作用域元数据

AnnotationScopeMetadataResolver 通过resolveScopeMetadata()方法解析注解Bean 定义类的作用域元信息,即判断注册的Bean 是原生类型(prototype)还是单态(singleton)类型,其源码如下: //解析注解Bean定义类中的作用域元信息 @Override public ScopeMetadata resolveScopeMetadata(BeanDefinition definition) { ScopeMetadata metada

Leon_Jinhai_Sun的博客 683

Spring 源码系列之 AnnotationConfigApplicationContext 是如何工作的

这篇文章对 spring源码的分析仅仅相当于 “hello,world” 的程度。 Spring 的 ApplicationContext 是非常重要的,之前总是从大的层面来看,比如整体的架构;现在尝试从更微小的层面来研究,两者相结合,对 Spring 的了解会更深刻。 AnnotationConfigApplicationContext context = new AnnotationC...

我与风来 596

Spring Boot 使用Java代码创建Bean并注册到Spring中

从 Spring3.0 开始,增加了一种新的途经来配置Bean Definition,这就是通过 Java Code 配置 Bean Definition。  与Xml和Annotation两种配置方式不同点在于: 前两种Xml和Annotation的配置方式为预定义方式,即开发人员通过 XML 文件或者 Annotation 预定义配置 bean 的各种属性后,启动 spring 容器,

红豆和绿豆的博客 753

spring(三)-----register方法注册一个bean

此文章只介绍使用register方法注册一个bean对象 AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(); ac.register(Appconfig.class); ac.refresh(); 大家都知道使用ac.register的方法去注册一个bean。那么这个bean是...

qq_37822914的博客 2730

B站评论区爬取与词频分析实战:从接口到可视化

爬虫是获取网络数据的重要手段,但很多网站的数据并非直接写在HTML源码中,而是通过异步接口动态加载。以B站评论为例,直接抓取页面只能得到空壳,必须定位到评论接口并模拟请求。理解这一原理后,可以借助requests库高效抓取JSON数据,用jieba进行中文分词,再通过pyecharts生成直观的词云和柱状图。这套流程广泛应用于舆情分析、用户反馈挖掘、热点话题追踪等场景,帮助快速洞察大量评论中的核心关键词。本文以B站评论为实战案例,完整演示从接口解析、翻页抓取、文本清洗到可视化展示的整个链路,并分享实际踩坑经

weixin_34236869的博客 459

2、Spring之Bean生命周期~扫描

不管那种方式都需要指定spring容器的扫描路径,xml文件通过 <context:component-scan /> 标签设置扫描路径,配置类通过 @ComponentScan 注解设置扫描路径,spring容器在拿到扫描路径之后就会对配置的路径进行挨个扫描,如果符合bean的要求,就会把他封装成一个BeanDefinition。这是只是大致过一个spring容器的创建,具体详细的创建步骤并不会展开细说,只说和bean生命周期有关的部分;findCandidateComponents方法详解。

sproutBoy的博客 1338

源代码如何修改为java代码_不直接修改JAVA源代码,运行中动态修改代码改变行为...

package org.springframework.context.annotation;//Spring包import com.navercorp.pinpoint.bootstrap.interceptor.AroundInterceptor; //注入字节码import com.navercorp.pinpoint.bootstrap.interceptor.Interceptor;im...

weixin_34315264的博客 319

Spring组件扫描机制原理与最佳实践

组件扫描是Spring框架实现控制反转(IoC)的核心机制,通过自动检测classpath下的类注解将符合条件的类注册为Bean。其底层基于ASM技术高效读取类元数据,避免了反射带来的性能开销。开发者可以通过@ComponentScan注解的basePackages和过滤器机制精确控制扫描范围,结合BeanDefinition的注册流程实现灵活的组件管理。在微服务架构和模块化开发中,合理的扫描策略能显著提升应用启动性能。本文结合Spring 5.3.18源码,深入解析了组件扫描在大型项目中的优化方案与常见问

weixin_34183910的博客 389

Spring Boot 之 BeanDefinitionLoader 详解

本文分析了Spring Boot中BeanDefinitionLoader的核心实现。BeanDefinitionLoader负责在应用启动时加载Bean定义,主要有四种方式:注解、XML配置、Groovy脚本和类路径扫描。其中默认使用AnnotatedBeanDefinitionReader进行注解方式的加载。

若千年后 262
上一篇: 部门工资最高的员工
下一篇: ES的模糊查询
大佛拈花
博客等级 码龄10年 2834粉丝 183原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值