@Configuration与@Component作为配置类的区别
@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作为配置类的区别相关推荐
- @Component和@Configuration作为配置类的差别
随着spingboot的大火,注解式配置受到了大家的热烈欢迎,而@Component和@Configuration都可以作为配置类,之前一直都没觉得这两个用起来有什么差别,可能有时程序跑的和自己想的有 ...
- @Configuration 和 @Component 区别
前言 开发中,我们经常使用@Configuration或者@Component标注一个类,用于注册到spring容器中,以便于在其他的类中可以动态的注入使用,默认情况下,大多数开发者也知道,@Conf ...
- 配置类Configuration
配置类@Configuration 01.概述 配置类:在springboot中被@Configuration或者@SpringBootConfiguration标注的类称之为配置类. 02.作用&a ...
- 2字段添加注释_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
文章来源:https://mp.weixin.qq.com/s/5UvbeEnZBS7niAJw_f-6pQ 原文作者:程序员DMZ Spring 用的爽不爽?在你爽的同时,你也知道为什么这么爽,在 ...
- spring中基于Java容器配置注解的区别及使用场景
转载自百家号作者:有趣的代码 @Component.@Service.@Controller.@Repository:@Configuration.@Bean区别,使用场景 从spring3.0开始, ...
- 软件框架SpringBoot-实现使用@Component@Data@Configuration@Bean(配置类控制类实体类)等方法实现将配置文件从8080端口显示在网页上
一.前言 1.该程序代码是使用idea2021.12版本编写的,若使用其他软件请对照好配置: 2.这个程序具体的内容我忘了,只知道使用@Component@ConfigurationPropertie ...
- Spring @Configuration和@Component的区别(enhancer的原因)
Spring @Configuration 和 @Component 区别 一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个 ...
- Spring的@Configuration配置类-Full和Lite模式
前言 各位小伙伴大家好,我是A哥.这是一篇"插队"进来的文章,源于我公众号下面的这句评论: 官方管这两种模式分别叫:Full @Configuration和lite @Bean m ...
- configuration和component的区别
@Configuration注解表明这个类是一个配置类.可以启动组件扫描,用来将带有@Bean的实体进行实例化bean等 把普通pojo实例化到spring容器中,相当于配置文件中的 <bean ...
- java在容器中导入图片_Java程序员必学技术:@Import直接导入类,在容器@Configuration、@Component中是怎么直接导入类注册到容器的?...
Java程序员必学技术:@Import直接导入类,在容器@Configuration.@Component中是怎么直接导入类注册到容器的? Spring IoC 容器是一个管理 Bean 的容器,在 ...
最新文章
- 练习 MongoDB 操作 —— 分片篇(五)
- kali2018.2安装配置OpenVAS-9及错误处置
- 为什么计算机模拟不了人脑,为什么计算机永远不会拥有人类的意识?听完科学家的解释恍然大悟...
- 北京排查利用数据中心挖矿,IDC矿场受影响较大
- python 写linux mysql_(linux)python之mysql数据库操作环境搭建
- 如何 给给软件开发 添加 代理_如何与软件开发公司有效沟通
- linux内核剪裁 4412,itop4412开发板-Linux内核的编译
- perl语言编程 第四版_被称作“胶水语言”的PERL,在芯片设计和验证中可以这样使用...
- 利用BioPerl将DNA序列翻译成蛋白序列
- selenium操作webdriver(一)
- python语法_str_eval
- UniAPP 使用高德地图,打包后定位api不执行
- 1+6t刷个lineage OS 20(Android13)
- 【2022河南省电赛】SWM181最小系统核心板-开源
- python基础知识之整除、取余、幂运算
- matlab 统计数组频数_matlab如何找出一个数在数组中出现次数
- 短波红外SWIR应用
- 纯JS实现填字游戏实战总结
- LeetCode 49. 字母异位词分组 Group Anagrams
- 虚拟机上服务器怎么设置密码,虚拟机邮箱服务器设置密码
热门文章
- 部分手机浏览器存在将ajax请求当成广告过滤的情况,及解决方案
- canvas绘制圆环
- 编译android4.4 报错error: call to '__property_get_too_small_error' declared with attribute 的处理 (转载)...
- 程序员面试宝典问题及解析
- UVALive 6181
- ADO BUG之'无法为更新定位行....' 解决之道
- 使用yum安装Apache+PHP+MySQL
- [Usaco2009 Feb]Revamping Trails 堆优化 Dijkstra
- kubernetes相关命令
- Navicat使用教程:获取MySQL中的行数(第1部分)