springboot自动装配及启动原理
自动配置类
Springboot中把相关功能的Bean放到了一个配置类中,分门别类,针对不同的场景,定义了不同的自动配置类,如:
- ServletWebServerFactoryAutoConfiguration:配置了Servlet Web场景中所需要的一些Bean
- TransactionAutoConfiguration:配置了事务场景中所需要的一些Bean
- AopAutoConfiguration:配置了AOP场景中所需要的一些Bean
- RabbitAutoConfiguration:配置了Rabbitmq场景中所需要的一些Bean 等等
使用这种结构后,SpringBoot就能让程序员更为方便的来控制某个Bean或某些Bean要不要生效,如
果某个自动配置类不生效,那该配置类中所定义的Bean则都不会生效。
条件注解
- ConditionalOnBean:是否存在某个某类或某个名字的Bean
- ConditionalOnMissingBean:是否缺失某个某类或某个名字的Bean
- ConditionalOnSingleCandidate:是否符合指定类型的Bean只有一个
- ConditionalOnClass:是否存在某个类
- ConditionalOnMissingClass:是否缺失某个类
- ConditionalOnExpression:指定的表达式返回的是true还是false
- ConditionalOnJava:判断Java版本
- ConditionalOnJndi:JNDI指定的资源是否存在
- ConditionalOnWebApplication:当前应用是一个Web应用
- ConditionalOnNotWebApplication:当前应用不是一个Web应用
- ConditionalOnProperty:Environment中是否存在某个属性
- ConditionalOnResource:指定的资源是否存在
- ConditionalOnWarDeployment:当前项目是不是以War包部署的方式运行
- ConditionalOnCloudPlatform:是不是在某个云平台上
自定义条件注解 @Conditional
SpringBoot中众多的条件注解,都是基于Spring中的@Conditional来实现的。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
/**
* All {@link Condition} classes that must {@linkplain Condition#matches match}
* in order for the component to be registered.
*/
Class<? extends Condition>[] value();
}
-
使用自定义条件注解
public class DemoCondition implements Condition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(ConditionalOnClass.class.getName()); String className = (String) annotationAttributes.get("value"); try { context.getClassLoader().loadClass(className); return true; } catch (ClassNotFoundException e) { return false; } } }
自动配置类解析的大体流程为:
- 读取spring.factories中的所有自动配置类
- 看是否配置了需要排除的自动配置类,进行排除
- 然后利用spring-autoconfigure-metadata.properties文件来过滤掉一些自动配置类(条件中指定的类不存在的自动配置类)
- 解析过滤后自动配置类,判断自动配置类所有的条件注解,条件全部符合才会真正去解析自动配置类上的其他内容,比如@Bean(也会进行条件判断)
SpringBoot整合Tomcat的核心原理主要涉及
- spring-boot-starter-web:会自动引入Tomcat、SpringMVC的依赖
- ServletWebServerFactoryAutoConfiguration:自动配置类
- ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar:用来注册
- WebServerFactoryCustomizerBeanPostProcessor
- ServletWebServerFactoryConfiguration.EmbeddedTomcat:配置TomcatServletWebServerFactory
- ServletWebServerFactoryConfiguration.EmbeddedJetty:配置JettyServletWebServerFactory
- ServletWebServerFactoryConfiguration.EmbeddedUndertow:配置UndertowServletWebServerFactory
- ServletWebServerFactoryCustomizer:用来配置ServletWebServerFactory
- WebServerFactoryCustomizerBeanPostProcessor:是一个BeanPostProcessor,利用ServletWebServerFactoryCustomizer来配置ServletWebServerFactory
- ServletWebServerApplicationContext中的onRefresh()方法:负责启动Tomcat