扫码阅读
手机扫码阅读

面试官:@Configuration 和 @Component 区别,你真的了解?

570 2024-07-18

我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。

查看原文:面试官:@Configuration 和 @Component 区别,你真的了解?
文章来源:
springboot葵花宝典
扫码关注公众号
文章摘要

@Configuration 和 @Component 的区别

1. @Component 和 @Configuration 的差别

从代码定义来看,@Configuration 本质上是 @Component 的一种。因此,@ComponentScan 可以扫描到加了 @Configuration 注解的类。

两者的主要区别在于:@Component 注册到 Spring 容器中的 Bean 是原始 Bean,而 @Configuration 注册到 Spring 容器中的 Bean 是使用 CGLIB 代理的 Bean。这可以通过代码案例和打印结果验证,@Configuration 类产生的 Bean 是代理对象,而 @Component 类产生的是原始 Bean。

2. @Configuration 的 Full 模式和 Lite 模式

Spring 对配置类分为两种模式:Full 模式和 Lite 模式。

2.1 Full 模式

Full 模式会使用 CGLIB 为配置类生成代理对象。代理的主要作用是确保容器中的 Bean 是单例的。例如,当一个 @Bean 方法调用另一个 @Bean 方法时,代理对象会检查容器中是否已经存在该 Bean,如果存在则直接返回容器中的对象,否则会创建新对象。这样可以保证 Bean 的单例性。

需要注意的是,在 Full 模式下,@Bean 方法不能是 finalprivate 类型,因为这些方法无法被代理。

如果将 @ConfigurationproxyBeanMethods 属性设置为 false,则会切换到 Lite 模式。

2.2 Lite 模式

Lite 模式下,配置类不会生成代理对象,而是直接使用原始对象。这意味着多个 @Bean 方法之间的调用不会复用容器中的对象,而是每次都会创建新的实例。例如,当配置类使用 @Component 注解时,@Bean 方法返回的对象是独立的,不会共享。

总结来说,Lite 模式适用于无需单例管理的场景,而 Full 模式则适用于需要确保 Bean 单例性的场景。

总结

@Configuration@Component 的主要区别在于是否使用代理对象,且 @Configuration 提供了 Full 模式和 Lite 模式的选择。根据具体场景选择合适的模式,可以提升 Spring 应用的灵活性和性能。

想要了解更多内容?

查看原文:面试官:@Configuration 和 @Component 区别,你真的了解?
文章来源:
springboot葵花宝典
扫码关注公众号