SpringBoot的自动配置
一、前言
自动配置(Auto-configuration)是指在应用程序启动时,根据一些默认规则和条件,自动配置应用程序的各种组件和功能。自动配置的目的是简化应用程序的配置过程,减少手动配置的工作量。自动配置可以根据应用程序所使用的框架、库或环境条件,自动配置相应的功能和组件。例如,在Spring Boot框架中,它提供了许多自动配置类,根据应用程序的依赖和配置情况,自动配置数据库连接池、Web服务器、日志记录等常见组件,使开发人员可以快速启动应用程序而无需手动配置这些组件。
二、与自动装配的区别
- 自动装配(autowiring)和自动配置(auto-configuration)是两个在软件开发中经常使用的概念,它们在不同的层面上有所区别。
- 自动装配(Autowiring)是指在依赖注入(Dependency Injection)的过程中,根据一定的规则自动地将依赖注入到相应的组件中,而无需手动显式地指定依赖关系。自动装配的目的是减少开发人员的工作量,提高开发效率。它可以根据一些规则(如类型匹配、名称匹配等)自动找到需要注入的依赖,然后将其注入到相应的类或组件中。在Spring框架中,自动装配是通过使用
@Autowired
注解或其他装配注解来实现的。 - 简而言之,自动装配关注的是依赖注入过程中的自动化,它处理类与类之间的依赖关系;而自动配置关注的是应用程序整体的自动化配置,它负责配置和初始化应用程序的各个组件和功能。
三、原理
Spring Boot自动配置的核心注解是 @SpringBootApplication
,是Spring Boot的启动类注解,该注解是一个复合注解。
Spring Boot的自动配置是通过条件化配置(Conditional Configuration)实现的。它基于条件判断来确定是否需要自动配置某个组件或功能,只有当满足特定条件时才会生效。下面是自动配置的一般原理:
- Starter依赖
Spring Boot中的各个模块通常使用Starter依赖作为入口点。Starter依赖是一组预定义的依赖项集合,它们引入了所需的库和依赖,以及必要的自动配置类。如何理解Starter?
starter就是定义了一个starter的Jar包,在这个Jar包中写入被
@Configuration
注解标注的配置类,配置类中定义了需要的Bean。然后在starter的META-INF/spring.factories
文件中以key-value的形式写入这些配置类,其中有一个key=EnableAutoConfiguration
,它对应的value值就是一个个以AutoConfiguration
结尾命名的×××AutoConfiguration
自动配置类。然后Spring Boot即可按照约定去加载配置类。# 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.batch.BatchAutoConfiguration,\ org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\ org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
- 条件注解
Spring Boot使用条件注解(Conditional Annotation)来标记自动配置类。这些条件注解基于某些条件判断是否要应用自动配置。例如,@ConditionalOnClass
表示只有在类路径中存在指定的类时,自动配置才会生效。 - 自动配置类
自动配置类是实现自动配置的核心。它们通常使用@Configuration
注解进行标记,并且包含了一系列的@Bean
方法,用于配置和初始化相应的组件。这些自动配置类会根据条件注解的判断,决定是否进行配置。 - 自动配置启动
当应用程序启动时,Spring Boot会自动扫描类路径上的自动配置类。根据条件注解的判断,Spring Boot会选择适合的自动配置类,并将其应用到应用程序中。
通过上述步骤,Spring Boot能够根据应用程序的依赖和环境条件,自动配置相应的组件和功能。这样,开发人员可以快速启动应用程序,并根据需要进行自定义配置,而无需手动配置每个组件。需要注意的是,自动配置并不是强制的,开发人员可以通过显式地配置来覆盖自动配置的行为。同时,Spring Boot还提供了属性配置(Properties Configuration)的机制,使开发人员可以通过配置文件或命令行参数来影响自动配置的行为。
四、总结
所以spring boot在整个的启动过程中,其实就是在类路径的META-INF/spring.factories
文件中找到EnableAutoConfiguration
对应的所有的自动配置类,然后将所有自动配置类加载到spring容器中。所有自动配置类都是以AutoConfiguration
结尾来命名的,而诸多的xxxAutoConfiguration
其实就是Spring容器的JavaConfig形式,它的作用就是为Spring容器导入bean。