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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值