千家信息网

@Configuration与@Component作为配置类的区别是什么

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇文章给大家分享的是有关@Configuration与@Component作为配置类的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来
千家信息网最后更新 2026年11月02日@Configuration与@Component作为配置类的区别是什么

本篇文章给大家分享的是有关@Configuration与@Component作为配置类的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

@Configuration注解的类:

/** * @Description 测试用的配置类 * @Author 弟中弟 * @CreateTime 2019/6/18 14:35 */@Configurationpublic class MyBeanConfig { @Bean public Country country(){ return new Country(); } @Bean public UserInfo userInfo(){ return new UserInfo(country()); }}

@Component注解的类:

/** * @Description 测试用的配置类 * @Author 弟中弟 * @CreateTime 2019/6/18 14:36 */@Componentpublic class MyBeanConfig { @Bean public Country country(){ return new Country(); } @Bean public UserInfo userInfo(){ return new UserInfo(country()); }}

测试:

@RunWith(SpringRunner.class)@SpringBootTestpublic class DemoTest { @Autowired private Country country; @Autowired private UserInfo userInfo; @Test public void myTest() { boolean result = userInfo.getCountry() == country; System.out.println(result ? "同一个country" : "不同的country"); }}

如果是@Configuration打印出来的则是同一个country,@Component则是不同的country,这是为什么呢?

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Configuration { @AliasFor( annotation = Component.class ) String value() default "";}

你点开@Configuration会发现其实他也是被@Component修饰的,因此context:component-scan/ 或者 @ComponentScan都能处理@Configuration注解的类。

@Configuration标记的类必须符合下面的要求:

配置类必须以类的形式提供(不能是工厂方法返回的实例),允许通过生成子类在运行时增强(cglib 动态代理)。

配置类不能是 final 类(没法动态代理)。

配置注解通常为了通过 @Bean 注解生成 Spring 容器管理的类,

配置类必须是非本地的(即不能在方法中声明,不能是 private)。

任何嵌套配置类都必须声明为static。

@Bean 方法可能不会反过来创建进一步的配置类(也就是返回的 bean 如果带有

@Configuration,也不会被特殊处理,只会作为普通的 bean)。

但是spring容器在启动时有个专门处理@Configuration的类,会对@Configuration修饰的类cglib动态代理进行增强,这也是@Configuration为什么需要符合上面的要求中的部分原因,那具体会增强什么呢?

这里是个人整理的思路 如果有错请指点

userInfo()中调用了country(),因为是方法那必然country()生成新的new contry(),所以动态代理增加就会对其进行判断如果userInfo中调用的方法还有@Bean修饰,那就会直接调用spring容器中的country实例,不再调用country(),那必然是一个对象了,因为spring容器中的bean默认是单例。不理解比如xml配置的bean

这里scope默认是单例。

以上是个人理解,详情源码的分析请看https://www.jb51.net/article/153430.htm

但是如果我就想用@Component,那没有@Component的类没有动态代理咋办呢?

/** * @Description 测试用的配置类 * @Author 弟中弟 * @CreateTime 2019/6/18 14:36 */@Componentpublic class MyBeanConfig { @Autowired private Country country; @Bean public Country country(){ return new Country(); } @Bean public UserInfo userInfo(){ return new UserInfo(country); }}

这样就保证是同一个Country实例了

以上就是@Configuration与@Component作为配置类的区别是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

配置 动态 方法 注解 代理 容器 测试 实例 处理 生成 不同 个人 必然 更多 知识 篇文章 详情 部分 面的 实用 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网巨头科技公司 朗新科技与工业互联网 腾讯阿里互联网科技 互联网 的科技创新 中国互联网科技发展 壹账通互联网科技 中国互联网金融科技基金 滨湖区互联网智能科技产品供应 衡水科技产业互联网平台 互联网公司会议桌创意科技软装饰 成都玖崟互联网科技有限公司乐商圈怎么样 港股科技和互联网 江阴互联网智能科技产品进口 互联网科技的全部知识 互联网科技大赛获奖感言 美国五大互联网科技公司市值多少 深圳互联网科技园地址 互联网对科技影响 保山浩联互联网科技有限公司 武汉亿视互联网科技有限公司 金融科技还是互联网 互联网公司 科技公司 鑫亿盛互联网科技 华中科技有哪些互联网大佬 顶级互联网科技成果有哪些 烟台灵鸽互联网科技有限公司 图游互联网科技 科技和互联网行业的特点 唐山双旺合互联网科技产业园 科技互联网公司两年变化
0