Spring Boot起步依赖源码分析(一)

[Spring Boot] 1. Spring Boot启动过程源码分析 关于Spring Boot,已经有很多介绍其如何使用的文章了,本文从源代码(基于Spring-boot 1.5.6)的角度来看看Spring Boot的启动过程到底是怎么样的,为何以往纷繁复杂的配置到如今可以这么简便。1. 入口类package com.example.demo;import org.springframework.boot.SpringApplication; import org 阅读详情

这里我们搭建一个简单的spring boot web应用
maven依赖
pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

下面是一个简单的spring boot的启动配置类,需要关注的有只有两点@EnableAutoConfiguration注解和SpringApplication类
(如果你还没有使用过搭建过spring boot的开发环境,请先查阅我的上篇博客3分钟快速搭建Spring Boot开发环境)

@EnableAutoConfiguration
public class MainInit {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(MainInit.class, args);
    }

}

1、程序入口

    public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
        return new SpringApplication(sources).run(args);
    }

这是一个静态方法创建了一个SpringApplication对象,注入了入口函数的Class(作用:获取@EnableAutoConfiguration注解)和args,并调用了SpringApplication对象的run()方法
2、构造初始化

    public SpringApplication(Object... sources) {
        initialize(sources);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    private void initialize(Object[] sources) {
        if (sources != null && sources.length > 0) {
            this.sources.addAll(Arrays.asList(sources));
        }
        this.webEnvironment = deduceWebEnvironment(); //推测当前是否是web环境
        setInitializers((Collection) getSpringFactoriesInstances(
                ApplicationContextInitializer.class));
        setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
        this.mainApplicationClass = deduceMainApplicationClass();
    }

这里的mainApplicationClass就是我们自己写的MainInit类
3、SpringApplication.run()

    public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        FailureAnalyzers analyzers = null;
        configureHeadlessProperty();
        SpringApplicationRunListeners listeners = getRunListeners(args);
        listeners.started();
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                    args);
            ConfigurableEnvironment environment = prepareEnvironment(listeners,
                    applicationArguments);
            Banner printedBanner = printBanner(environment);
            context = createApplicationContext();
            analyzers = new FailureAnalyzers(context);
            prepareContext(context, environment, listeners, applicationArguments,
                    printedBanner);
            refreshContext(context);
            afterRefresh(context, applicationArguments);
            listeners.finished(context, null);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass)
                        .logStarted(getApplicationLog(), stopWatch);
            }
            return context;
        }
        catch (Throwable ex) {
            handleRunFailure(context, listeners, analyzers, ex);
            throw new IllegalStateException(ex);
        }
    }

看到这里,如果追过spring源码的老司机应该就很熟悉,这里初始化了spring,afterRefresh(context, applicationArguments)最终会调用AbstractApplicationContext.refresh()方法中,在这里会构建spring的ioc容器
4、构建ioc容器

@Override
    public void refresh() throws BeansException, IllegalStateException {
        synchronized (this.startupShutdownMonitor) {
            // Prepare this context for refreshing.
            prepareRefresh();

            // Tell the subclass to refresh the internal bean factory.
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            // Prepare the bean factory for use in this context.
            prepareBeanFactory(beanFactory);

            try {
                // Allows post-processing of the bean factory in context subclasses.
                postProcessBeanFactory(beanFactory);

                // Invoke factory processors registered as beans in the context.
                invokeBeanFactoryPostProcessors(beanFactory);

                // Register bean processors that intercept bean creation.
                registerBeanPostProcessors(beanFactory);

                // Initialize message source for this context.
                initMessageSource();

                // Initialize event multicaster for this context.
                initApplicationEventMulticaster();

                // Initialize other special beans in specific context subclasses.
                onRefresh();

                // Check for listener beans and register them.
                registerListeners();

                // Instantiate all remaining (non-lazy-init) singletons.
                finishBeanFactoryInitialization(beanFactory);

                // Last step: publish corresponding event.
                finishRefresh();
            }

            catch (BeansException ex) {
                if (logger.isWarnEnabled()) {
                    logger.warn("Exception encountered during context initialization - " +
                            "cancelling refresh attempt: " + ex);
                }

                // Destroy already created singletons to avoid dangling resources.
                destroyBeans();

                // Reset 'active' flag.
                cancelRefresh(ex);

                // Propagate exception to caller.
                throw ex;
            }

            finally {
                // Reset common introspection caches in Spring's core, since we
                // might not ever need metadata for singleton beans anymore...
                resetCommonCaches();
            }
        }
    }

这里构建了IOC容器,因为在pom.xml中我们加入了spring mvc的依赖,这里spring boot会自动把spring mvc所需要的bean注册到IOC容器中,这里我们不看IOC容器是如果构建的,只关心spring boot 是如何自动把spring mvc所需要的bean注册到IOC容器中的。还记得@EnableAutoConfiguration注解吗?(如果忘了,请翻到博客头部回忆一下)下面是EnableAutoConfiguration注解的源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    /**
     * Exclude specific auto-configuration classes such that they will never be applied.
     * @return the classes to exclude
     */
    Class<?>[] exclude() default {};

    /**
     * Exclude specific auto-configuration class names such that they will never be
     * applied.
     * @return the class names to exclude
     * @since 1.3.0
     */
    String[] excludeName() default {};

}

主要看EnableAutoConfigurationImportSelector这个类,这个类会导入spring boot中的一个配置文件,方法如下:

    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
            AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
                getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
        Assert.notEmpty(configurations,
                "No auto configuration classes found in META-INF/spring.factories. If you "
                        + "are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

这个方法会导入spring-boot-autoconfigure包下META-INF/spring.factories配置文件
spring.factories

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.AutoConfigurationReportLoggingInitializer

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.hornetq.HornetQAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.DeviceDelegatingViewResolverAutoConfiguration,\
org.springframework.boot.autoconfigure.mobile.SitePreferenceAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
org.springframework.boot.autoconfigure.social.SocialWebAutoConfiguration,\
org.springframework.boot.autoconfigure.social.FacebookAutoConfiguration,\
org.springframework.boot.autoconfigure.social.LinkedInAutoConfiguration,\
org.springframework.boot.autoconfigure.social.TwitterAutoConfiguration,\
org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
org.springframework.boot.autoconfigure.velocity.VelocityAutoConfiguration,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration,\
org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration,\
org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration,\
org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration,\
org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration,\
org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer

# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.velocity.VelocityTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.JspTemplateAvailabilityProvider

通过getCandidateConfigurations方法,会把配置文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration=后的所有配置类的全类名信息读取到一个List集合中,这里看到一个比较亲切的名字org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration看类名就能猜到这应该就是我们需要找东西了。2016年12月21日23:43:06 时间不早,(~﹃~)~zZ 下次再战,预知后事如何,请听下回分解

Spring boot源码分析一 本文主要记录springBoot start的机制以及自动装配的原理解读。 阅读详情

相关推荐

【Spring Boot 与 Spring Cloud 深度 Mape 之一】剖析 Spring Boot 核心:从快速构建到自动配置原理与实战

起步依赖 (Starters):通过聚合依赖和版本管理,极大地简化了项目依赖配置。自动配置 (Auto-Configuration):利用和注解,根据项目依赖智能装配 Bean,减少了大量样板代码。统一配置管理:通过yml文件以及 Profile 机制,实现了灵活、强大的应用配置。同时,我们也学习了如何快速搭建 Spring Boot Web 应用,并利用Actuator对应用进行基本的监控与管理。掌握这些基础是理解后续 Spring Cloud 微服务治理组件的前提。

weixin_52568491的博客 1076

org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata

1,报错原因 springboot 版本和springcloud 版本不一致 2,环境 springboot 版本 2.5.4 原来的springcloud 版本 Hoxton.SR12 替换springcloud 版本为2020.0.3 3,错误 2021-09-16 09:50:15.851 WARN 916 --- [ main] s.c.a.AnnotationConfigApplicationContext : Exception encountered du

f335830104的博客 1万+

Spring Boot 源码分析(一):自动装配

至此,Spring Boot自动装配的源码分析了一下。本质就是通过采用Spring的@Import注解方式、@ConditionOnXXX系列注解、Spring SPI机制这三种方法实现了自动装配。源码设计的精巧有趣,跟一遍你会更好的利用Spring Boot这笔资源。

m0_59236433的博客 1231

原项目引入springcloud报错:org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata

原来springboot项目引入分布式springcloud报错处理,org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata

qun7559的博客 5721

Spring Boot 源码分析

在Spring Boot框架中,最先接触的应该就是SpringApplication这个类。所以源码分析也先从这个类开始。 SpringApplication用来从Java的main方法中启动Spring Boot应用。他的行为包括: 创建适当的应用上下文实例对应CommandLinePropertySource和Spring的参数初始化应用上下文,并且加载单例Bean触发Comman

青铁的专栏 4067

openlayers6【十九】vue HeatmapLayer热力图层实现热力图效果详解

文章目录1. 写在前面2. Heatmap 类实现热力图2.1 Heatmap 参数2.2 实现热力图3. 完整代码4. 添加删除map图层的方法5. 热力图自身的get,set方法 1. 写在前面 我们主要看热力图的效果,区域绘制效怎么设置详细内容可以访问 openlayers6【十七】vue VectorLayer矢量图层画地图省市区,多省市区(粤港澳大湾区)效果详解 在 openlayers 中,图层是使用 layer 对象表示的,主要有 WebGLPoints Layer、热度图(HeatMap L

@必意玲 1万+

IDEA| java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.context

问题:java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.context.properties.ConfigurationPropertiesBeans] from ClassLoader [sun.misc.Launcher$AppClassLoader@18b4aac2] 场景:在搭建springcloud项目时,创建eureka服务提供方时,启动时项目报错: org.spri

KevinBrain的博客 1万+

【图像大模型】RIFE实战:如何通过中间流估计实现4K视频的实时插帧优化

本文深入解析了基于深度学习的RIFE视频插帧算法,重点探讨其核心的中间流估计技术如何实现高效精准的帧生成。通过实战教程,详细介绍了针对4K视频的实时处理优化方案,包括环境配置、参数调优及性能瓶颈分析,帮助用户利用消费级显卡将低帧率视频转化为流畅的高帧率体验。

weixin_29093017的博客 455

No auto configuration classes found in META-INF/spring.factories报错

该问题出现在把打的jar包在cmd命令行执行时所出现的错,查找原因是META-INF/spring.factories中找不到自动配置类,排查问题是打包出现问题。 解决方式:pom文件添加相对于maven配置 <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <co

木牛马 1万+

python代码爬取大众点评评论!直接copy就可以运行!

python代码爬取大众点评评论!直接copy就可以运行!

QiuQiRuQin的博客 1万+

激光三角测量法:斜射与直射式技术的原理与应用解析

本文深入解析激光三角测量法中斜射式与直射式技术的原理、应用及对比。斜射式适用于高精度小范围测量,尤其擅长处理反光表面;直射式则适合大范围位移检测,结构更简单。文章详细介绍了两种技术的光路分析、数学建模、应用场景及选型建议,并探讨了系统校准与误差分析方法,为工业检测领域提供实用参考。

weixin_29280219的博客 413

Spring-boot-2.6.3集成nacos报NoClassDefFoundError问题解决

Spring-boot-2.6.3集成nacos报NoClassDefFoundError问题解决

青青子衿的博客 8366

机器人学(三):手眼标定

主要讲了eye-to-hand的手眼标定求解算法,包括AX=XB和AX=YB两种情况,包含SVD法、Tsai-Lenz法、最小二乘法等,从原理到解法再到算法代码实现,包括matlab代码、C++代码、库的使用等,简单明了,容易在实际项目中进行应用

行者无疆的博客 2553

Spring-04Spring Boot核心架构(自动配置+起步依赖)

Spring Boot架构摘要 Spring Boot采用分层架构设计,包含应用层、自动配置层、起步依赖层、内嵌服务器层和监控管理层。核心架构通过@SpringBootApplication注解触发自动配置流程,由AutoConfigurationImportSelector加载spring.factories中的配置类,结合Condition注解实现条件化配置。起步依赖简化了依赖管理,内嵌服务器支持多种Web容器选择。Actuator提供完善的监控端点,底层基于Spring Framework核心模块。启

d3y1`5 81_09 965

python爬取银行年报2

python爬取公司年报(巨潮资讯网)

bboysteed的博客 4730

【AI Agent】Hermes Agent解析

Hermes Agent:一个具备持久化学习能力的开源AI Agent框架 核心特点: 突破传统Agent的"无状态困境",通过记忆系统(SQLite+FTS5全文检索)实现跨会话经验积累 支持200+模型自由切换,11种模型家族和15+平台接入 五层架构设计(入口层、编排层、推理层、工具执行层、存储层)实现平台无关性 47+内置工具和动态技能沉淀机制,支持从任务执行中自动提炼可复用Skill 独特的四层记忆体系(会话/每日/长期/向量索引)和辩证式用户建模 与传统Agent对比: 具备自我进化能力,通过A

sysu_lluozh 912

Spring源码分析十:Spring中的循环依赖深度解析

Spring源码分析十:Spring中的循环依赖深度解析

我从不打没有准备的仗! 1万+

统计学习导论(ISLR) 第四章分类算法课后习题

统计学习导论(ISLR) 参考资料: The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习导论(ISLR)(二):统计学习概述 统计学习导论(ISLR)(三):线性回归 统计学习导论(ISLR)(四):分类 ISLR统计学习导论之R语言应用(二):R语言基础 ISLR统计学习导论之R语言应用(三):线性回归R语言代码实战 ISLR统计学习导论之R语言应用(四):分类算法R语言代码实战 统计学习导论

阿里云专家博主、数据科学领域优质创作者、统计er在读 2万+

Spring Boot整合Tomcat底层源码分析

在目录下,定义一个启动类,并使用java复制代码在java复制代码@Override");本文通过深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,特别是其与Tomcat的整合方式,展示了Spring Boot的强大功能和灵活性。同时,通过手写模拟Spring Boot的启动过程,进一步加深了对Spring Boot内部工作机制的理解。希望本文能为读者在使用Spring Boot进行开发时提供有益的参考和帮助。

喜欢猪猪 1391

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring-boot-loader原理及源码分析-刘宇

Spring-boot-loader原理及源码分析-刘宇一、什么是Spring-boot-loader二、jar包中内容解析2.1、目录结构2.2、MANIFEST.MF内容解析2.3、为何需要使用spring-boot-loader2.3.1、jar文件的规范2.3.2、疑问:为什么不直接将DemoApplication.class放于根目录中呢?三、spring-boot-loader源码分析3.1、从JarLauncher切入3.2、获取项目的归档文件3.3、进入Launcher中的launch方法3

刘宇的博客 4429

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【spring-boot 源码解析】spring-boot 依赖管理

关键词:spring-boot 依赖管理、spring-boot-dependencies、spring-boot-parent 问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程越来越庞大,依赖越来越多,各种二方包、三方包太多太多,依赖冲突处理起来真是让人头疼,经常需要涉及到多个地方需要调整。 微信公众号:逸飞兮(专注于java知识领域的源码分析,从源码中理解框架/工具原理、...

逸飞兮 1521

Spring Boot Loader源码分析

分析Spring Boot Loader源码其实就是在搞懂为何Spring Boot打成jar包可以直接运行起来。 一)、探索从解压jar包开始 解压项目打包成的jar包,我们可以得到三个文件夹 BOOT-INF,内部还有两个文件夹classes(存放项目相关字节码文件)和lib(存放项目所依赖第三方jar包) META-INF,关于项目的一些元数据 Manifest-Version: 1.0 Implementation-Title: spring_boot_dissect Implement

IceStreamLab 1002

源码分析——Spring-boot 依赖管理

问题 maven 工程,依赖管理是非常基本又非常重要的功能,现在的工程越来越庞大,依赖越来越多,各种二方包、三方包太多太多,依赖冲突处理起来真是让人头疼,经常需要涉及到多个地方需要调整。 解决方案 使用统一的依赖管理模块来管理工程中的所有依赖。 spring-boot 工程常使用 spring-boot-dependencies、spring-boot-starter-parent 管理工程依赖。 spring-boot 的最上级工程是 spring-boot-build,以下开始一步一步深入了解 spri

Java码农那些事 315

Spring Boot原理篇

自动配置的核心是条件注解(如),它检查环境是否满足条件(如类是否存在),然后加载配置类。所有自动配置类列在文件中。例如,引入后,如果 classpath 有,则加载,创建嵌入式 Tomcat。自定义 Starter 允许开发者封装模块,实现复用。原理:创建自动配置类,注册到。创建项目结构两个模块:autoconfigure(配置逻辑)、starter(依赖描述)。命名规范。。autoconfigure 模块。

2301_79894935的博客 842

Spring Boot 依赖注入为 null 问题

可以看到它实现了 SmartInstantiationAwareBeanPostProcessor 接口,BeanPostProcessor 接口,就是用于 Spring 创建实例后做后置处理的,这里就是用来创建 AOP 代理对象。Spring 容器在实例化bean后,就会通过 postProcessAfterInitialization 来做 bean 的后置处理。

2340

Spring Boot系列十五 spring boot集成RabbitMQ 源码分析

1. 概述在这篇文章Spring Boot系列十三 Spring Boot集成RabbitMQ中,我们介绍了在Spring Boot如何使用RabbitMQ,本篇文章中,从源码中分析Spring Boot如何集成RabbitMQ。2. 入口在spring-boot-autoconfigure.jar中的spring.factories中有如下定义,表示spring启动时,会执行RabbitAutoC

不积跬步无以至千里; 不积小流无以成江海 9969
上一篇: 3分钟快速搭建Spring Boot开发环境
下一篇: Spring Boot起步依赖源码分析(二)
coley-wu
博客等级 码龄12年 859粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值