@SpringBootApplication包含三个注解:
@EnableAutoConfiguration
@ComponentScan(basePackages="com.xxx")
@SpringBootConfiguration 等同于 @Configuration ,只是换了个别名
SpringBoot程序推断应用类型未Servlet,设置ApplicationContext的实例为AnnotationConfigApplicationContext ,就在这里设置了内置的internalConfigurationAnnotationProcessor,刷新上下文的时候,调用内置的internalConfigurationAnnotationProcessor,其实例为ConfigurationClassPostProcessor , 交由ConfigurationClassPostProcessor驱动,委托ConfigurationClassParser负责解析
解析流程如下:
1.解析memberClass 也就是Configuration注解的内部还有一个@Configuration修饰的类 参考 WebSocketServletAutoConfiguration 类 里面的TomcatWebSocketConfiguration类 这就是memberClass,memberClass仍然是一个独立的Configuration注解,可以有bean注解,import注解等。
2.解析PropertySource注解
2.解析ComponentScan , ComponentScans 注解 指定basePackages 最常用的基于注解的配置就是在这里被ComponentScanParser解析的 ,放入到configurationClasses里面
格式是
@Configuration
public class xxx{
@Bean
public Test test(){
}
}
3.解析@Import注解
若@Import(value=xxx.class), xxx 是 ImportSelector 的子类, 这种功能等同于 自定义一些类来作为配置类来加载 ...等同于@Configuration ,可以参考类 @EnableAsync 注解 ,等同于 @Import(AsyncConfigurationSelector.class)
若@Import(value=xxx.class), xxx 是 ImportBeanDefinitionRegistrar 的子类, 放入 importBeanDefinitionRegistrars 属性里 ,可以参考 @EnableFeignClients 注解 ,
4.解析@ImportResource注解,可以兼容老版本的基于xml配置文件的bean配置
@ImportResource({ "classpath:spring/applicationContext-caffeine-cache.xml" })
5.解析@Bean方法注解,将@Bean配置的方法放入属性beanMethods里面
6.如果有实现某个实现类,将实现类的默认方法上带@Bean注解的放入到属性beanMethods里面
7.处理父类
注解式的ApplicationContext提供了6个内置的postProcessor来支持特定的注解,比如
0 = "org.springframework.context.annotation.internalConfigurationAnnotationProcessor" , 支持@Configuration @Import @ImportSource @ComponentScan @PropertySource @Bean
1 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor"
2 = "org.springframework.context.annotation.internalRequiredAnnotationProcessor"
3 = "org.springframework.context.annotation.internalCommonAnnotationProcessor"
4 = "org.springframework.context.event.internalEventListenerProcessor"
5 = "org.springframework.context.event.internalEventListenerFactory"

5125

被折叠的 条评论
为什么被折叠?



