@Configuration是用来替换xml的注解,功能等同于xml配置文件,@Bean标注的方法等同于xml文件里的一个<bean/>标签

1.xml可以配置多个,同样@Configuration也可以配置多个,application.xml相当于主配置类(启动就加载进容器的配置类),如DemoApplication类 

@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

2.AnnotationConfigServletWebServerApplicationContext spring容器实例化时,

public AnnotationConfigServletWebServerApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}

3.new AnnotatedBeanDefinitionReader(this)实例化reader对象的时候,往容器中注册了ConfigurationClassPostProcessor后置处理器的beanDefinition

4.AbstractApplicationContext#refresh()-->>AbstractApplicationContext#invokeBeanFactoryPostProcessors-->>ConfigurationClassPostProcessor#processConfigBeanDefinitions,BeanFactoryPostProcessor后置处理器操作,循环容器中的beanDefinition,解析beanDefinition的注解,主要是解析有@Configuration注解的主配置类DemoApplication,判断是full模式还是lite模式,放入集合A中

5.创建ConfigurationClassParser类,循环集合A,解析主配置类下面要扫描的所有注解类(默认主配置类所在包结构为根目录),分类解析,类生成configClasses,@bean注解的方法生成beanMethod,组装configClasses集合

6.ConfigurationClassBeanDefinitionReader处理configClasses集合,生成beanDefinition对象(如果是full模式,生成代理后的),beanDefinition注册进容器中

 7.如果只使用ClassPathBeanDefinitionScanner,就没有主次配置之分,直接扫描包下面的注解类,生成BeanDefinition对象,注册进容器。AbstractApplicationContext#refresh()-->>AbstractApplicationContext#invokeBeanFactoryPostProcessors-->>ClassPathBeanDefinitionScanner#doScan

@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = new AnnotationConfigServletWebServerApplicationContext("com.example.demo");
}
}