SpringBoot autoconfigure

本文解析了Spring Boot如何通过自动配置将bean注入IOC容器。它利用@Conditional注解确保只有在满足特定条件下才进行自动配置。此外,还介绍了如何通过@EnableAutoConfiguration启用此功能,并列举了一些Spring Boot支持的技术栈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot 实现了根据classpath下依赖内容自动配置bean到IOC容器,----》Auto configuration(自动配
置).Springboot可以完美配置各种Spring子项目,如Spring mvc,security、data。。。

springboot auto configuration会尝试推断哪些bean是用户需要的,并进行初始化

1、通过class标注@configuration,并基于@ConditionalOnClass和OnMissingBean等@Conditional注解的条件过滤,保证springboot满足一定条件下,才会将bean自动注入IOC容器
2、要使用自动配置,首先要添加@EnableAutoConfiguration注解,springboot通过该注解使用给@import注解完成导入配置的功能,配置在META-INFO/spring.factories中定义

@Configuration(proxyBeanMethods = false)
class ServletWebServerFactoryConfiguration {

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass({ Servlet.class, Tomcat.class, UpgradeProtocol.class })
    @ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
    static class EmbeddedTomcat {

        @Bean
        TomcatServletWebServerFactory tomcatServletWebServerFactory(
                ObjectProvider<TomcatConnectorCustomizer> connectorCustomizers,
                ObjectProvider<TomcatContextCustomizer> contextCustomizers,
                ObjectProvider<TomcatProtocolHandlerCustomizer<?>> protocolHandlerCustomizers) {
            TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
            factory.getTomcatConnectorCustomizers()
                    .addAll(connectorCustomizers.orderedStream().collect(Collectors.toList()));
            factory.getTomcatContextCustomizers()
                    .addAll(contextCustomizers.orderedStream().collect(Collectors.toList()));
            factory.getTomcatProtocolHandlerCustomizers()
                    .addAll(protocolHandlerCustomizers.orderedStream().collect(Collectors.toList()));
            return factory;
        }

    }

    /**
     * Nested configuration if Jetty is being used.
     */
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass({ Servlet.class, Server.class, Loader.class, WebAppContext.class })
    @ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
    static class EmbeddedJetty {

        @Bean
        JettyServletWebServerFactory JettyServletWebServerFactory(
                ObjectProvider<JettyServerCustomizer> serverCustomizers) {
            JettyServletWebServerFactory factory = new JettyServletWebServerFactory();
            factory.getServerCustomizers().addAll(serverCustomizers.orderedStream().collect(Collectors.toList()));
            return factory;
        }

    }

    /**
     * Nested configuration if Undertow is being used.
     */
    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass({ Servlet.class, Undertow.class, SslClientAuthMode.class })
    @ConditionalOnMissingBean(value = ServletWebServerFactory.class, search = SearchStrategy.CURRENT)
    static class EmbeddedUndertow {

        @Bean
        UndertowServletWebServerFactory undertowServletWebServerFactory(
                ObjectProvider<UndertowDeploymentInfoCustomizer> deploymentInfoCustomizers,
                ObjectProvider<UndertowBuilderCustomizer> builderCustomizers) {
            UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory();
            factory.getDeploymentInfoCustomizers()
                    .addAll(deploymentInfoCustomizers.orderedStream().collect(Collectors.toList()));
            factory.getBuilderCustomizers().addAll(builderCustomizers.orderedStream().collect(Collectors.toList()));
            return factory;
        }

        @Bean
        UndertowServletWebServerFactoryCustomizer undertowServletWebServerFactoryCustomizer(
                ServerProperties serverProperties) {
            return new UndertowServletWebServerFactoryCustomizer(serverProperties);
        }

    }

}

ServletWebServerFactoryAutoConfiguration.java定义:根据Conditional条件注解实现Bean初始化

@Configuration(proxyBeanMethods = false)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
@ConditionalOnClass(ServletRequest.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(ServerProperties.class)     // 对应的Properties配置
@Import({ ServletWebServerFactoryAutoConfiguration.BeanPostProcessorsRegistrar.class,
        ServletWebServerFactoryConfiguration.EmbeddedTomcat.class,
        ServletWebServerFactoryConfiguration.EmbeddedJetty.class,
        ServletWebServerFactoryConfiguration.EmbeddedUndertow.class })
public class ServletWebServerFactoryAutoConfiguration {

    @Bean
    public ServletWebServerFactoryCustomizer servletWebServerFactoryCustomizer(ServerProperties serverProperties,
            ObjectProvider<WebListenerRegistrar> webListenerRegistrars) {
        return new ServletWebServerFactoryCustomizer(serverProperties,
                webListenerRegistrars.orderedStream().collect(Collectors.toList()));
    }

    @Bean
    @ConditionalOnClass(name = "org.apache.catalina.startup.Tomcat")
    public TomcatServletWebServerFactoryCustomizer tomcatServletWebServerFactoryCustomizer(
            ServerProperties serverProperties) {
        return new TomcatServletWebServerFactoryCustomizer(serverProperties);
    }

Spring整合的有:
amqp,AOP,CAP,batch,cache,cassandra数据库,codec,condition注入,couchbase,dao,data,elasticsearch,flyway,freemarker,graphql,groovy,gson,h2,hateosa,hazelcast,http,indlux,info,interation,jackson,jdbc,jersey,jms,jmx,joop,jsonb,kafkamldap,lihibase,logging,mail,mongodb,mustache,neo4j,netty,orm,quarts,r2dbc,rsocket,security,sendgrid,session,sql,webervice,websocket,thymealeaf.

消息队列有:jms,amqp,kafka
数据库: jdbc,couchbase,r2dbc,mongodb:neo4j
模板语言:,mustache ,freemarker,thymealeaf
组件:quarts
网络协议:http,netty

参考文档:
https://www.cnblogs.com/clarino/p/16344670.html

### Spring Boot 源码分析 #### 了解Spring Boot的核心模块 Spring Boot由两个主要核心模块构成,即`SpringBoot`和`SpringBoot Autoconfigure`。前者负责提供快速搭建开发环境的功能;后者则通过自动配置简化了应用程序的设置过程[^3]。 #### 初始化流程中的Sources加载与BeanDefinitionLoader创建 在启动过程中,在初始化操作执行前会优先完成对`sources`的加载工作,紧接着基于这些已加载的资源来实例化并配置`BeanDefinitionLoader`对象用于后续bean定义信息读取处理等任务[^4]。 #### 探索监听机制——自定义ApplicationListener实现方式 对于希望深入理解事件驱动架构下的应用行为捕捉以及响应逻辑定制化的开发者而言,研究如何编写自己的`ApplicationListener`是一个很好的切入点。这涉及到掌握监听器注册、触发条件设定及其回调方法调用链路等方面的知识点[^1]。 ```java // 定义一个简单的 Application Listener 来接收特定类型的事件通知 @Component public class MyApplicationListener implements ApplicationListener<ApplicationReadyEvent> { @Override public void onApplicationEvent(ApplicationReadyEvent event) { System.out.println("The application is now ready!"); } } ``` 为了更高效地探索整个框架内部运作机理,建议参考专门针对Spring Boot源码解析而撰写的书籍资料,这类资源往往能够为读者建立起完整的知识体系结构,并传授有效的源码剖析技巧[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值