首先一句话:

@Configuration修饰的类会被Cglib动态代理,@Component不会。

详细:

Cglib动态代理生成当前对象的子类Class,并对方法拦截,多次调用@Bean方法时直接从BeanFactory之中获取,得到同一个对象。

实际是因为

注解下有个proxyBeanMethods属性,默认值为true,如果手动设为false,直接调用@Bean方法和@Autowired拿到的就不是同一个对象了,当然,你直接调用@Bean方法跟直接调用其他方法也没有区别了,相当于你直接调用的时候,没有被代理类执行,本来执行什么,现在执行什么。比如:B类下有个c对象是@Autowired的,如果把proxyBeanMethods设为false,直接调用@Bean方法生成的B类对象,c成员变量为null。

另外,如果你想搜索这个属性在哪里使用的话,去搜字符串,因为它的源码是这样的:

入口类:

org.springframework.context.annotation.ConfigurationClassUtils

即使用@Configuration时

  @Autowired自动注入的对象和直接调用@Bean修饰的方法及多次调用@Bean修饰的方法拿到的是同一个对象。

当然,多个@Autowired自动注入的对象不管使用哪个注解拿到的都是同一个对象哈,因为默认是单例的嘛

看个例子就好理解了:

@Configuration
// @Component
public class Test { @Bean
public A a(){
A a = new A();
a.setB1(b());
a.setB2(b());
return a;
} @Bean
public B b(){
B b = new B ();
return b;
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
public class OnlyTest {
@Autowired
private A a; @Autowired
private B b3; @Autowired
private B b4; @Test
public void testCompare() {
System.out.println(a.getB1 == b3? "同一个b" : "不同的b");
System.out.println(b3 == b4? "同一个b" : "不同的b");
System.out.println(a.getB1() == a.getB2() ? "同一个b" : "不同的b");
}
}

运行结果:

使用@Configuration时:

同一个b

同一个b

同一个b

使用@Component时:

不同的b

同一个b

不同的b

解释一 下:

第一个判断,判断的是@AutoWired自动注入和直接调用@Bean方法获得的对象是不是同一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个

第二个判断,判断的是两个被@AutoWired自动注入的变量是不是同一个,结论:不管使用的是@Component还是@Configuration,都是同一个,因为默认是单例的,其实这种情况跟本次讨论的@Component和@Configuration的对比没关系,放这里是怕理解出现混淆

第三个判断,判断的是多次调用@Bean方法,返回的对象是不是一个,结论:使用@Component时不是同一个,使用@Configuration时是同一个

【一句话】@Configuration和@Component的区别的更多相关文章

  1. Spring @Configuration 和 @Component 区别

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

  2. pring @Configuration 和 @Component 区别

    一句话概括就是 @Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用该方法返回的都是同一个实例. 从定义来看, @Configuration 注解本质上还是 @Com ...

  3. @configuration和@component之间的区别

    @configuration和@component之间的区别是:@Component注解的范围最广,所有类都可以注解,但是@Configuration注解一般注解在这样的类上:这个类里面有@Value ...

  4. React.createClass和extends Component的区别

    React.createClass和extends Component的区别主要在于: 语法区别 propType 和 getDefaultProps 状态的区别 this区别 Mixins 语法区别 ...

  5. SPRING IN ACTION 第4版笔记-第二章-001-用@Autowired\@ComponentScan、@Configuration、@Component实现自动装载bean

    1. package soundsystem; import org.springframework.context.annotation.ComponentScan; import org.spri ...

  6. @Bean 和@ Component的区别

    @Component auto detects and configures the beans using classpath scanning whereas @Bean explicitly d ...

  7. @component @bean区别

    from: http://stackoverflow.com/questions/10604298/spring-component-versus-bean http://stackoverflow. ...

  8. angular5 directive和component的区别

    指令分为三类,组件,属性指令和结构性指令 组件(Component directive):UI组件,继承于Directive: 属性指令(Attribute directive):改变组件的样式: 结 ...

  9. vue.extend与vue.component的区别和联系

    一味的闷头开发,却对基础概念缺乏理解,是个大坑... 查阅官网后现对自己的理解记录一下,用于日后复习巩固 Vue.extend({}) 简述:使用vue.extend返回一个子类构造函数,也就是预设部 ...

  10. vue.extend和vue.component的区别

    vue.extend 使用基础 Vue 构造器函数,通过原型继承,(返回)创建一个"子类"(构造器).参数是一个包含组件选项的对象. const Sub = function Vu ...

随机推荐

  1. [zoj] 4178. Killing the Brute-force

    题目 Chenjb is the task author of the 71-st Zhejiang Provincial Collegiate Programming Contest. He cre ...

  2. mysql如何备份

    mysqldump -h主机 -u用户名 -p密码 库名 表名 >xxx.sql

  3. VS2019 iis无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行

    可以检查W3SVC服务与WAS这两个服务是否正在运行. 重启这两个服务就可以正常了

  4. C# Aspose.Words.Document.PageCount 踩坑笔记(获取文档页数)

    事情是这样的,我需要获取Word文档的页数,结果就遇到了这个坑人的问题. var doc = new Aspose.Words.Document(@"相对路径"); doc.Pag ...

  5. 程序员面试干货:漫谈计算机网络:数据链路层 ----- 数据链路路在何方? --从点对点数据传输 到 "广泛撒网,重点捕获"的局域网

    面试答不上?计网很枯燥? 听说你学习 计网 每次记了都会忘? 不妨抽时间和我一起多学学它 深入浅出,用你的空闲时间来探索计算机网络的硬核知识! 博主的上篇连载文章<初识图像处理技术> 图像 ...

  6. 命令查询职责分离 - CQRS

    概念 CQRS是一种与领域驱动设计和事件溯源相关的架构模式, 它的全称是Command Query Responsibility Segregation, 又叫命令查询职责分离, Greg Young ...

  7. 14 STL-常用算法

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦! 每一次学习都是为了追求智慧! 写在前面,本篇章主要介绍STL中常用算法. 算法主要由 ...

  8. MySQL进阶实战1,数据类型与三范式

    一.选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要. 1.更小的 一般情况下,应该尽量使用较小的数据类型,更小的数据类型通常更快,因为占用更少的磁盘.内存 ...

  9. Leetcode-SQL学习计划-SQL入门-584:寻找用户推荐人

    建表语句: Create table If Not Exists Customer (id int, name varchar(25), referee_id int) Truncate table ...

  10. Java语言进阶 day02【Collection、泛型】

    主要内容 Collection集合 迭代器 增强for 泛型 教学目标