@Configuration , @Component 都可作为配置类。
但有区别:
@Configuration 中 所有 带有 @Bean的注解都会被动态代理(CGLIB),
因此对bean的调用返回的都是同一实例。
@Component 没有被动态代理,每次调用返回的都是不同实例。
原因是ConfigurationClassPostProcessor类中,调用enhanceConfigurationClasses方法,
被注解@Configuration的类进行CGLIB代理。
public void enhanceConfigurationClasses(ConfigurableListableBeanFactory beanFactory) {
Map<String, AbstractBeanDefinition> configBeanDefs = new LinkedHashMap<String, AbstractBeanDefinition>();
for (String beanName : beanFactory.getBeanDefinitionNames()) {
BeanDefinition beanDef = beanFactory.getBeanDefinition(beanName);
if (ConfigurationClassUtils.isFullConfigurationClass(beanDef)) {//判断是否被@Configuration标注
if (!(beanDef instanceof AbstractBeanDefinition)) {