面试官:@Configuration 和 @Component 区别,你真的了解?
![](/theme/default/default/images/main/eye-open.png)
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
![](/theme/default/default/images/main/icon-jing.png)
面试官:@Configuration 和 @Component 区别,你真的了解?
本文对比了 @Configuration 和 @Component 注解的区别,并解释了 Spring 中 Full 和 Lite 模式的概念。
1. @Component和@Configuration作为配置类的差别
官方文档指出,@Component 注解的类中使用@Bean注解与在 @Configuration 中使用@Bean的行为是不同的。在 @Component 注解的类中注册的 Bean 不会使用 CGLIB 进行增强,而 @Configuration 注解的类中注册的 Bean 会被 CGLIB 代理。代码实验显示,使用 @Configuration 注解的 Bean 是 CGLIB 代理的 Bean,而使用 @Component 注解的 Bean 保持原始状态。
2. @Configuration 注解的 Full 模式和 Lite 模式
Spring 将配置类分为 FULL 模式和 LITE 模式。FULL 模式会通过 CGLIB 为配置类生成代理,而 LITE 模式则不会。
2.1 FULL模式
FULL 模式通过代理确保配置类中的方法调用返回的 Bean 是单例的。例如,当配置类中的一个方法调用另一个@Bean标注的方法时,它会检查容器中是否存在相应的 Bean,而不是每次都创建新的实例。这就保证了 Bean 的单例性。但 FULL 模式下使用@Bean的方法不能是 final 或 private,因为需要被代理覆盖。如果 @Configuration 的 proxyBeanMethods 设置为 false,则配置类变为 Lite 模式。
2.2. LITE模式
LITE 模式下,Spring 容器中得到的是原始对象,而非代理对象。如果@Configuration类标记为@Component,那么即使在配置类中互相调用@Bean方法,Spring 容器中的 Bean 也可能不是同一个实例。
文章最后鼓励读者转载分享,并要求注明出处以支持原创。
想要了解更多内容?
![](/theme/default/default/images/main/icon-jing.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)
![](https://cdn.easycorp.cn/rongpm/upload/202312/f_39217d624bb2b42ce8f6322ebd7e573a.png)