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

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

@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
方法不能是 final
或 private
类型,因为这些方法无法被代理。
如果将 @Configuration
的 proxyBeanMethods
属性设置为 false
,则会切换到 Lite 模式。
2.2 Lite 模式
Lite 模式下,配置类不会生成代理对象,而是直接使用原始对象。这意味着多个 @Bean
方法之间的调用不会复用容器中的对象,而是每次都会创建新的实例。例如,当配置类使用 @Component
注解时,@Bean
方法返回的对象是独立的,不会共享。
总结来说,Lite 模式适用于无需单例管理的场景,而 Full 模式则适用于需要确保 Bean 单例性的场景。
总结
@Configuration
和 @Component
的主要区别在于是否使用代理对象,且 @Configuration
提供了 Full 模式和 Lite 模式的选择。根据具体场景选择合适的模式,可以提升 Spring 应用的灵活性和性能。
想要了解更多内容?



白皮书上线