一道经典面试题:@Configuration 和 @Component 有何区别?
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
文章摘要
本文通过案例展示了@Configuration与@Component注解的区别,讨论了为什么@Configuration标记的类注册到Spring容器后会成为代理对象,以及这种代理增强了什么功能。通过源码分析,文章进一步解释了@Configuration的Full模式与Lite模式的处理过程。
1. 情景展现
文章首先介绍了一个案例,演示了@Configuration和@Component注解的使用。案例中,JavaConfig01类使用@Configuration注解,而JavaConfig02类使用@Component注解。通过加载Spring XML配置文件并初始化容器,发现@Configuration注解的Bean是CGLIB代理的类,而@Component注解的Bean则保持原始类。这表明@Configuration注解的类通过代理增强了功能。
2. 源码分析
文章接着通过源码分析解释了@Configuration注解的Full模式和Lite模式。ConfigurationClassPostProcessor类负责处理@Configuration注解的类,在Bean定义时修改BeanDefinition以重新定义Bean的行为。文章详细讨论了postProcessBeanDefinitionRegistry方法和postProcessBeanFactory方法,这两个方法分别负责确认配置类的模式,并通过动态代理增强配置类。
文中解释了如果一个类使用@Configuration且proxyBeanMethods属性为true,则为Full模式;如果类标记了@Component、@ComponentScan、@Import、@ImportResource注解之一或包含@Bean方法,则为Lite模式。Full模式下,通过ConfigurationClassEnhancer类和CGLIB动态代理技术,生成代理类来增强@Configuration标记的类,实现代理方法intercept,从而避免@Bean注解标记的方法导致Bean的重复创建。
文章总结指出,@Configuration和@Component的主要区别在于前者使用CGLIB代理增强了Bean的功能,尤其是在处理@Bean方法时避免了重复创建Bean的问题。
想要了解更多内容?