news 2026/10/15 7:06:46

对比 @Configuration(Full) vs @Component(Lite)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
对比 @Configuration(Full) vs @Component(Lite)

核心现象:同一个类里面,@Bean方法互相调用,Full拿单例,Lite新建对象

1. 两个简单Bean

publicclassABean{}publicclassBBean{publicABeanaBean;publicBBean(ABeanaBean){this.aBean=aBean;}}

2. Full模式(@Configuration)

importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;@Configuration// Full模式,CGLIB代理publicclassFullConfig{@BeanpublicABeanaBean(){System.out.println("Full -> 创建ABean");returnnewABean();}@BeanpublicBBeanbBean(){// 在配置类内部调用 aBean()ABeana=aBean();returnnewBBean(a);}}

3. Lite模式(@Component + @Bean)

importorg.springframework.context.annotation.Bean;importorg.springframework.stereotype.Component;@Component// Lite模式,无CGLIB代理publicclassLiteConfig{@BeanpublicABeanaBean(){System.out.println("Lite -> 创建ABean");returnnewABean();}@BeanpublicBBeanbBean(){// 普通java方法调用!ABeana=aBean();returnnewBBean(a);}}

4. 启动类 & 测试

importorg.springframework.boot.CommandLineRunner;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.context.ApplicationContext;@SpringBootApplicationpublicclassBeanDemoAppimplementsCommandLineRunner{publicstaticvoidmain(String[]args){SpringApplication.run(BeanDemoApp.class,args);}@Overridepublicvoidrun(String...args)throwsException{ApplicationContextctx=BeanDemoApp.this;// FullConfigBBeanfullB=ctx.getBean("bBean",BBean.class);ABeanfullA=ctx.getBean("aBean",ABean.class);System.out.println("Full模式:bBean里面的aBean 和容器aBean是否同一个:"+(fullB.aBean==fullA));// LiteConfigBBeanliteB=ctx.getBean("liteConfig.bBean",BBean.class);ABeanliteA=ctx.getBean("liteConfig.aBean",ABean.class);System.out.println("Lite模式:bBean里面的aBean 和容器aBean是否同一个:"+(liteB.aBean==liteA));}}

控制台输出结果

Full -> 创建ABean Full模式:bBean里面的aBean 和容器aBean是否同一个:true Lite -> 创建ABean Lite -> 创建ABean Lite模式:bBean里面的aBean 和容器aBean是否同一个:false

解读

  1. Full(@Configuration)
    bBean()里调用aBean(),不是直接执行方法,而是被代理拦截,从Spring容器返回已存在的单例,只实例化一次。

  2. Lite(@Component + @Bean)
    没有代理,bBean()调用aBean()就是普通Java方法执行,new了两次ABean:一次是bBean构造用的,一次是Spring扫描@Bean注册的,两个对象地址不一样。

⚠️ 注意:如果不通过内部方法调用,只是单独定义一堆互不引用的@Bean,Lite模式看起来一切正常,坑藏在内部互相调用场景。

补充:Spring 6 / SpringBoot3 新变化

Spring6 引入@Configuration(proxyBeanMethods = false)

@Configuration(proxyBeanMethods=false)publicclassConfig{@Bean...}

这个也是Lite模式!
虽然写了@Configuration,但是关闭代理,内部方法调用同样会新建对象。

现在SpringBoot很多自动配置都用这个,好处:不需要CGLIB,启动更快,代价就是不能内部调用@Bean方法。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 7:06:28

H.264整数DCT与量化原理:8×8块精度陷阱与QP控制机制

简介:本资源是一份面向数字视频编码学习者与图像处理方向研究生的H.264核心算法深度解析文档,聚焦整数DCT变换与量化两大关键技术环节,解决传统DCT浮点运算复杂、编解码误匹配等工程实践痛点。文档为单个Word文件(.doc&#xff09…

作者头像 李华
网站建设 2026/10/15 7:06:16

WorkBuddy 实战:两周上线安卓 App 的完整记录

1. 从零到上线:为什么我选择 WorkBuddy 作为主力开发工具去年年底我接了一个私活,客户要求两周内交付一个能上架安卓应用市场的工具类 App。预算不高,功能倒不算复杂——一个带 WebView 的内容聚合页,加上本地缓存和推送。我评估了…

作者头像 李华
网站建设 2026/10/15 7:06:13

职场努力为何不值钱?把努力精准兑换成价值的底层逻辑

在职场上待得越久,越会发现一个让人不太舒服的真相:努力这件事,本身并没有那么值钱。你可能每天第一个到工位,最后一个走,任务来了从来不推,领导半夜发消息秒回,但这种状态维持三五年之后&#…

作者头像 李华
网站建设 2026/10/15 7:06:13

用 Claude Opus 5.5 写代码做视频:7类技术路线与提示词框架

平时做视频,最烦的不是创意不够,而是剪辑、合成、字幕这些重复劳动太耗时间。我最近把制作视频的流程大改了一遍,核心就一件事:让 Claude Opus 5.5 帮我写代码,再用这些代码去生成视频。没错,就是用代码做视…

作者头像 李华
网站建设 2026/10/15 7:06:08

ENSP双核心网络搭建:MSTP、VRRP与Eth-Trunk协同实战

1. 为什么“双核心”不是堆设备,而是网络骨架的重新设计“ensp - 双核心网络搭建(简化) - 项目二”这个标题里,“双核心”三个字最容易被新手误解成“多放一台交换机就叫双核心”。我带过不少刚接触企业网架构的学员,第…

作者头像 李华
网站建设 2026/10/15 7:05:41

分时电价下家庭能量管理的MILP建模与MATLAB实现

前阵子把一个“基于分时电价的家庭能量管理策略研究”整理成了可复现的 MATLAB 代码,过程中踩了不少坑,也把建模思路重新捋了一遍。这个题目在电气工程课程设计和毕业设计里出现频率很高,很多人第一反应就是套一个优化算法跑结果,…

作者头像 李华