@Configuration注解的类:

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

@Component注解的类:

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

测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoTest {@Autowiredprivate Country country;@Autowiredprivate UserInfo userInfo;@Testpublic void myTest() {boolean result = userInfo.getCountry() == country;System.out.println(result ? "同一个country" : "不同的country");}}
复制代码

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

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @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

<bean id="country" class="com.hhh.demo.Country" scope="singleton"/>
复制代码

这里scope默认是单例。

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

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

/*** @Description 测试用的配置类* @Author 弟中弟* @CreateTime 2019/6/18 14:36*/
@Component
public class MyBeanConfig {@Autowiredprivate Country country;@Beanpublic Country country(){return new Country();}@Beanpublic UserInfo userInfo(){return new UserInfo(country);}
}
复制代码

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


如果有错请大佬们指点 谢谢 0.0

转载于:https://juejin.im/post/5d087cebe51d457759648706

@Configuration与@Component作为配置类的区别相关推荐

  1. @Component和@Configuration作为配置类的差别

    随着spingboot的大火,注解式配置受到了大家的热烈欢迎,而@Component和@Configuration都可以作为配置类,之前一直都没觉得这两个用起来有什么差别,可能有时程序跑的和自己想的有 ...

  2. @Configuration 和 @Component 区别

    前言 开发中,我们经常使用@Configuration或者@Component标注一个类,用于注册到spring容器中,以便于在其他的类中可以动态的注入使用,默认情况下,大多数开发者也知道,@Conf ...

  3. 配置类Configuration

    配置类@Configuration 01.概述 配置类:在springboot中被@Configuration或者@SpringBootConfiguration标注的类称之为配置类. 02.作用&a ...

  4. 2字段添加注释_2w字长文给你讲透了配置类为什么要添加 @Configuration注解

    文章来源:https://mp.weixin.qq.com/s/5UvbeEnZBS7niAJw_f-6pQ 原文作者:程序员DMZ Spring 用的爽不爽?在你爽的同时,你也知道为什么这么爽,在 ...

  5. spring中基于Java容器配置注解的区别及使用场景

    转载自百家号作者:有趣的代码 @Component.@Service.@Controller.@Repository:@Configuration.@Bean区别,使用场景 从spring3.0开始, ...

  6. 软件框架SpringBoot-实现使用@Component@Data@Configuration@Bean(配置类控制类实体类)等方法实现将配置文件从8080端口显示在网页上

    一.前言 1.该程序代码是使用idea2021.12版本编写的,若使用其他软件请对照好配置: 2.这个程序具体的内容我忘了,只知道使用@Component@ConfigurationPropertie ...

  7. Spring @Configuration和@Component的区别(enhancer的原因)

    Spring @Configuration 和 @Component 区别 一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个 ...

  8. Spring的@Configuration配置类-Full和Lite模式

    前言 各位小伙伴大家好,我是A哥.这是一篇"插队"进来的文章,源于我公众号下面的这句评论: 官方管这两种模式分别叫:Full @Configuration和lite @Bean m ...

  9. configuration和component的区别

    @Configuration注解表明这个类是一个配置类.可以启动组件扫描,用来将带有@Bean的实体进行实例化bean等 把普通pojo实例化到spring容器中,相当于配置文件中的 <bean ...

  10. java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...

    Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 ...

最新文章

  1. 练习 MongoDB 操作 —— 分片篇(五)
  2. kali2018.2安装配置OpenVAS-9及错误处置
  3. 为什么计算机模拟不了人脑,为什么计算机永远不会拥有人类的意识?听完科学家的解释恍然大悟...
  4. 北京排查利用数据中心挖矿,IDC矿场受影响较大
  5. python 写linux mysql_(linux)python之mysql数据库操作环境搭建
  6. 如何 给给软件开发 添加 代理_如何与软件开发公司有效沟通
  7. linux内核剪裁 4412,itop4412开发板-Linux内核的编译
  8. perl语言编程 第四版_被称作“胶水语言”的PERL,在芯片设计和验证中可以这样使用...
  9. 利用BioPerl将DNA序列翻译成蛋白序列
  10. selenium操作webdriver(一)
  11. python语法_str_eval
  12. UniAPP 使用高德地图,打包后定位api不执行
  13. 1+6t刷个lineage OS 20(Android13)
  14. 【2022河南省电赛】SWM181最小系统核心板-开源
  15. python基础知识之整除、取余、幂运算
  16. matlab 统计数组频数_matlab如何找出一个数在数组中出现次数
  17. 短波红外SWIR应用
  18. 纯JS实现填字游戏实战总结
  19. LeetCode 49. 字母异位词分组 Group Anagrams
  20. 虚拟机上服务器怎么设置密码,虚拟机邮箱服务器设置密码

热门文章

  1. 部分手机浏览器存在将ajax请求当成广告过滤的情况,及解决方案
  2. canvas绘制圆环
  3. 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)...
  4. 程序员面试宝典问题及解析
  5. UVALive 6181
  6. ADO BUG之'无法为更新定位行....' 解决之道
  7. 使用yum安装Apache+PHP+MySQL
  8. [Usaco2009 Feb]Revamping Trails 堆优化 Dijkstra
  9. kubernetes相关命令
  10. Navicat使用教程:获取MySQL中的行数(第1部分)