博客
关于我
还不懂Spring Boot启动原理的话,一定要看看!
阅读量:376 次
发布时间:2019-03-05

本文共 3501 字,大约阅读时间需要 11 分钟。

Spring Boot 启动与自动化配置深度解析

Spring Boot 项目的开发离不开其核心注解和运行机制,本文将从启动类及其背后的注解以及Spring Boot 的内部工作原理为你展开全面的解读。

一、Spring Boot 启动类的核心注解

Spring Boot 应用的启动类通常会使用 @SpringBootApplication 注解。这个注解是 Spring Boot 的核心注解,它实际上是多个注解的组合,具体包括:

  • @Configuration:标注的类本身就是一个 Spring IoC 容器的配置类。
  • @EnableAutoConfiguration:开启自动化配置功能,自动加载符合条件的 bean 定义。
  • @ComponentScan:启动组件扫描,自动发现和注册符合条件的 Spring 组件。

这三个注解共同作用,使得开发者无需手动配置,就能获得一个完整的 Spring Boot 应用程序。以下是一个仅包含这三个注解的简单启动类:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

二、@Configuration 的作用

@Configuration 注解的作用是将一个类视为 Spring IoC 容器的配置类。它表示这个类可以用来定义 Spring 的 bean。与传统的 XML 配置相比,基于注解的配置有以下优势:

  • 表达形式的自由:可以通过方法返回类型定义 bean,支持接口与实现类绑定。
  • 依赖注入的便捷性:可以通过 @Autowired 注解进行依赖注入。
  • 更高的可读性:配置更加直观,便于维护和扩展。
  • 例如,一个简单的配置类可以替代传统的 XML 配置:

    @Configuration
    public class MockConfiguration {
    @Bean
    public MockService mockService() {
    return new MockServiceImpl();
    }
    }

    三、@ComponentScan 的功能

    @ComponentScan 注解用于自动扫描 Java 类路径下标注了 @Component 及其子接口(如 @Repository@Service@Controller)的类,将其注册为 Spring IoC 容器的 bean。默认情况下,组件扫描会从启动类所在的包及其子包中进行。

    @ComponentScan
    public class Application {
    public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
    }
    }

    四、@EnableAutoConfiguration 的机制

    @EnableAutoConfiguration 注解的核心作用是开启自动化配置功能。它通过 @Import 导入 EnableAutoConfigurationImportSelector,从而根据应用的 classpath 自动加载所有符合条件的 Spring Boot 自动配置类。这些配置类会自动注册到 IoC 容器中,提供必要的 bean 定义。

    五、Spring Boot 启动流程解析

    Spring Boot 的 SpringApplication.run() 方法启动应用的核心流程主要包括以下几个步骤:

  • 初始化监听器:加载 ApplicationContextInitializerApplicationListener
  • 创建应用上下文:根据环境配置创建 ConfigurableApplicationContext
  • 加载自动化配置:通过 SpringFactoriesLoader 加载所有自动化配置类。
  • 刷新应用上下文:完成 IoC 容器的刷新,注册所有 bean 定义。
  • 以下是 SpringApplication 的核心实现类图:

    class SpringApplication {
    void run() {
    // 初始化环境和上下文
    prepareEnvironment();
    createApplication();
    // 加载自动化配置
    loadAutoConfiguration();
    // 刷新上下文
    refresh();
    }
    }

    六、自动化配置的实现原理

    自动化配置的核心在于 SpringFactoriesLoaderEnableAutoConfiguration 的结合。SpringFactoriesLoader 从 classpath 中加载 META-INF/spring.factories 文件,提取其中的自动化配置类,并反射加载这些类的 bean 定义。

    以下是 SpringFactoriesLoader 的关键实现:

    public class SpringFactoriesLoader {
    public List
    loadFactoryNames(Class
    factoryClass, ClassLoader classLoader) {
    // 加载 spring.factories 文件中的所有实现类
    return loadFactoryNames(factoryClass.getName(), classLoader);
    }
    }

    spring.factories 文件中的内容通常是如下的格式:

    org.springframework.boot.autoconfigure: EnableAutoConfiguration=org.springframework.boot.autoconfigure.EnableAutoConfiguration

    这表明 Spring Boot 自动配置功能已被启用。

    七、实际应用中的自动化配置示例

    以 MyBatis 的自动化配置为例,Spring Boot 会自动配置 SqlSessionFactory 等组件。以下是 MybatisAutoConfiguration 的实现:

    @Configuration
    @ConditionalOnClass(SqlSessionFactory.class, SqlSessionFactoryBean.class)
    public class MybatisAutoConfiguration {
    @Bean
    @ConditionalOnBean(DataSource.class)
    public SqlSessionFactory mybatisSessionFactory(
    @Autowired DataSource dataSource,
    @Value("${mybatis.config.file}") String configFile) {
    return new SqlSessionFactory(dataSource, configFile);
    }
    }

    此外,@ConditionalOnMissingBean 保证了只有在缺少特定 bean 时,才会创建相应的 bean 定义。

    八、总结

    通过以上分析,我们可以清晰地看到 Spring Boot 启动类和自动化配置的工作原理。@SpringBootApplication 的组合注解确保了开发者的便利性,而 SpringApplication 的启动流程和 SpringFactoriesLoader 的自动化配置机制则为项目的配置和运行提供了强有力的支持。理解这些核心机制有助于更高效地开发和维护 Spring Boot 应用程序。

    转载地址:http://tevg.baihongyu.com/

    你可能感兴趣的文章
    nodejs字符与字节之间的转换
    查看>>
    NodeJs学习笔记001--npm换源
    查看>>
    NodeJs学习笔记002--npm常用命令详解
    查看>>
    nodejs学习笔记一——nodejs安装
    查看>>
    vue3+Element-plus icon图标无法显示的问题(已解决)
    查看>>
    NodeJS实现跨域的方法( 4种 )
    查看>>
    nodejs封装http请求
    查看>>
    nodejs常用组件
    查看>>
    nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
    查看>>
    Nodejs异步回调的处理方法总结
    查看>>
    NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
    查看>>
    nodejs支持ssi实现include shtml页面
    查看>>
    Nodejs教程09:实现一个带接口请求的简单服务器
    查看>>
    nodejs服务端实现post请求
    查看>>
    nodejs框架,原理,组件,核心,跟npm和vue的关系
    查看>>
    Nodejs概览: 思维导图、核心技术、应用场景
    查看>>
    nodejs模块——fs模块
    查看>>
    Nodejs模块、自定义模块、CommonJs的概念和使用
    查看>>
    nodejs生成多层目录和生成文件的通用方法
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>