Spring注解中@Configuration和@Component的区别是什么 - 开发技术

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
本文小编为大家详细介绍“Spring注解中@Configuration和@Component的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring注解中@Configuration和@Component的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

Spring 注解中 @Configuration 和 @Component 的区别总结为一句话就是:

@Configuration 中所有带 @Bean 注解的方法都会被动态代理(cglib),因此调用该方法返回的都是同一个实例。而 @Conponent 修饰的类不会被代理,每实例化一次就会创建一个新的对象。

@Configuration 注解的源代码中,使用了 @Component 注解:

Spring注解中@Configuration和@Component的区别是什么

从定义来看, @Configuration 注解本质上还是 @Component,因此 <context:component-scan/> 或者 @ComponentScan 都能处理 @Configuration 注解的类。

下面我们通过一个例子来说明上述情况:

// 使用@Configuration和@Bean注解创建Room实例和People实例,并注入进spring容器
@Configuration
public class RoomPeopleConfig {
 
    @Bean
    public Room room() {
        Room room = new Room();
        room.setId(1);
        room.setName("房间");
        room.setPeople(people());// 在创建Room实例时,再调用一次People()创建一个People实例
        return room;
    }
 
    @Bean
    public People people() {
        People people = new People();
        people.setId(1);
        people.setName("小明");
        return people;
    }
 
}
 
// 下面是测试代码
@SpringBootTest
@ContextConfiguration(classes = Application.class)
public class ConfigurationTests {
 
    @Autowired
    private Room room;
 
    @Autowired
    private People people;
 
 
    @Test
    public void test() {
        System.out.println(people == room.getPeople() ? "是同一个实例" : "不是同一个实例");
    }
 
}

输出结果:

Spring注解中@Configuration和@Component的区别是什么

如果将 @Configuration 换成 @Component ,则输出:

Spring注解中@Configuration和@Component的区别是什么

从上面的结果可以发现使用 @Configuration 时在 people 和 spring 容器之中的是同一个对象,而使用 @Component 时是不同的对象。这就是因为 @Configuration 使用了 cglib 动态代理,返回的是同一个实例对象。

虽然 @Component 注解也会当做配置类,但是并不会为其生成 CGLIB 代理 Class,所以在生成 room 对象时和生成 people 对象时调用 people( ) 方法执行了两次 new 操作,所以是不同的对象。当使用 @Configuration 注解时,生成当前对象的子类 Class,并对方法拦截,第二次调用 people()方法时直接从 BeanFactory 之中获取对象,所以得到的是同一个对象。

读到这里,这篇“Spring注解中@Configuration和@Component的区别是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注片云行业资讯频道。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Spring

“Spring注解中@Configuration和@Component的区别是什么 - 开发技术” 的相关文章

thinkphp5如何去除重复查询 - 编程语言

这篇文章主要讲解了“thinkphp5如何去除重复查询”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“thinkphp5如何去除重复查询”吧! 一、使用 SELECT DISTINCT 关键字...

ubuntu简单设置上网输入法

上网:sudo pppoeconfig 使用静态IP上网, #sudo gedit /etc/network/interfaces 在interfaces文件中输入以下内容: auto lo iface lo inet loopback auto eth0...

查看系统有多少人登录过

who:列出所有详细 who | wc -l:列出总人数...

python正则

import re m = re.match('abc','abcd') if m is not None: print m.group() print re.split(',','a,b,c,d,e,f,g') abc ['a', 'b', 'c', 'd', 'e', 'f', 'g...

动力节点王鹤SpringBoot3学习笔记——第六章 远程访问@HttpExchange[SpringBoot 3]

远程访问是开发的常用技术,一个应用能够访问其他应用的功能。Spring Boot提供了多种远程访问的技术。 基于HTTP协议的远程访问是支付最广泛的。Spring Boot3提供了新的HTTP的访问能力,通过接口简化HTTP远程访问,类似Feign功能。Spring包装了底层HTTP客户的访问细节。...

php转义字符处理的方式有哪些 - 编程语言

这篇文章主要讲解了“php转义字符处理的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php转义字符处理的方式有哪些”吧! PHP转义字符处理:在PHP开发中,为了避免字符串数据中...