欧美电影免费网站,遂宁网站设计,网站建设合同要不要交印花税,网站模板 html5自动配置原理 概述原理Spring Boot Starterspring.factories 文件ConditionalOnX 注解配置 Bean配置属性 源码剖析 主页传送门#xff1a;#x1f4c0; 传送 概述 Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。它极大地简化了 Spring 应用程序的开… 自动配置原理 概述原理Spring Boot Starterspring.factories 文件ConditionalOnX 注解配置 Bean配置属性 源码剖析 主页传送门 传送 概述 Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。它极大地简化了 Spring 应用程序的开发过程其中一个关键的功能就是自动配置Auto-Configuration。 自动配置可以根据项目需求自动配置各种服务和组件它可以帮助开发者在不需要显式配置的情况下快速地构建一个运行的应用程序。 自动配置是 Spring Boot 的一个核心特性它通过分析项目的依赖和环境自动地为应用程序配置 Spring 配置文件。这意味着开发者无需手动配置大量的 Spring BeanSpring Boot 会根据环境和项目的依赖来智能地为应用程序创建所需的 Bean。
原理 Spring Boot的自动配置原理基于Java的反射机制和Spring的IoC容器。它通过读取项目中的配置文件如application.properties或application.yml根据配置信息自动创建和配置各种服务。
可以概括为以下几个步骤
Spring Boot Starter Spring Boot 项目通常依赖于所谓的 “Starters”这是一组预定义了常用库的依赖集合。Starters 包含了应用程序所需的所有依赖比如 Web Starter 会包含用于构建 Web 应用程序的所有必要库。
spring.factories 文件 在每个 Starter 的 META-INF/spring.factories 文件中定义了一系列的自动配置类。这些自动配置类会在应用程序启动时被 Spring Boot 自动扫描和加载。
ConditionalOnX 注解 在自动配置类中通常会使用 ConditionalOnX 注解来控制该自动配置是否生效。这个注解会根据特定的条件比如类是否在类路径中、特定的 Bean 是否存在等来决定是否应用这个配置。
配置 Bean 自动配置类会定义一些必要的 Bean并使用 Configuration 注解将它们标记为配置类。这些 Bean 会在 Spring 上下文中被自动注册。
配置属性 自动配置类还可以通过读取 application.properties 或 application.yml 文件中的属性来自定义它们的行为。这样开发者可以根据需要进行定制。
源码剖析 Spring Boot 应用的启动类一般均位于src/main/java根路径下
SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}SpringBootApplication开启组件扫描和自动配置而SpringApplication.run则负责启动引导应用程序。SpringBootApplication是一个复合Annotation它将三个有用的注解组合在一起
Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
Documented
Inherited
SpringBootConfiguration
EnableAutoConfiguration
ComponentScan(excludeFilters {Filter(type FilterType.CUSTOM, classes TypeExcludeFilter.class),Filter(type FilterType.CUSTOM, classes AutoConfigurationExcludeFilter.class) })
public interface SpringBootApplication {// ...省略内容
}SpringBootConfiguration就相当于Configuration它是 Spring 框架的注解标明该类是一个JavaConfig配置类。而ComponentScan启用组件扫描。 EnableAutoConfiguration注解表示开启 Spring Boot 自动配置功能Spring Boot 会根据应用的依赖、自定义的 bean、classpath 下有没有某个类 等等因素来猜测你需要的 bean然后注册到 IOC 容器中。EnableAutoConfiguration是如何推算出需求的首先来看下它的定义
Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
Documented
Inherited
AutoConfigurationPackage
Import(EnableAutoConfigurationImportSelector.class)
public interface EnableAutoConfiguration {// ...省略内容
} 重点关注点在Import({AutoConfigurationImportSelector.class}) Import注解用于导入类并将这个类作为一个 bean 的定义注册到容器中这里它将把EnableAutoConfigurationImportSelector作为 bean 注入到容器中而这个类会将所有符合条件的Configuration 配置都加载到容器中查看EnableAutoConfigurationImportSelector代码可以看到
AutoConfigurationImportSelector 实现了DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered 这些接口。核心代码为
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {//...public String[] selectImports(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return NO_IMPORTS;} else {AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry this.getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}}
}再来具体看getAutoConfigurationEntry 方法具体是如何判断哪些是需要导入的。
protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;} else {AnnotationAttributes attributes this.getAttributes(annotationMetadata);ListString configurations this.getCandidateConfigurations(annotationMetadata, attributes);configurations this.removeDuplicates(configurations);SetString exclusions this.getExclusions(annotationMetadata, attributes);this.checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations this.getConfigurationClassFilter().filter(configurations);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);}}annotationMetadata 参数是一个元数据接口它提供了对注解元数据的访问权限通常用于在运行时检查类上的注解。
getAutoConfigurationEntry(annotationMetadata)方法会根据传入的 annotationMetadata返回一个 AutoConfigurationEntry 对象。
AutoConfigurationEntry 是一个内部类用于封装自动配置项的信息包括该自动配置项的类名、条件Conditions等信息。 通过获取到的 autoConfigurationEntry 对象Spring Boot 就能够知道哪些自动配置类需要被导入从而将它们注册到 Spring 上下文中。 如果喜欢的话欢迎 关注 点赞 评论 收藏 一起讨论你的支持就是我✍️创作的动力