Spring Boot自动装配原理

简介: Spring Boot自动装配原理以及源码深入
  • 前言
  • SpringBoot是一个脚手架,通常喜欢拿SpringBoot和Spring做比较,SpringBoot只是对于SSM框架开发时候的配置项做了一个默认配置,将开发中约定大于配置进行了实现,大大节约了开发时间写各种繁琐的配置文件环节,达到了开箱即用的便捷体验
  • SpringBoot入口
// 源码入口就是 @SpringBootApplication注解@SpringBootApplicationpublicclassBootDemoApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(BootDemoApplication.class, args);
    }
}


  • 查看@SpringBootApplication注解
@Inherited@SpringBootConfiguration@EnableAutoConfiguration// 自动装配原理的核心注解@ComponentScan(excludeFilters= { @Filter(type=FilterType.CUSTOM, classes=TypeExcludeFilter.class),
@Filter(type=FilterType.CUSTOM, classes=AutoConfigurationExcludeFilter.class) })
public@interfaceSpringBootApplication {
  • 查看@EnableAutoConfiguration注解
@Inherited@AutoConfigurationPackage/*** 自动装配的时候使用的是@Import注解* 作用是导入一个或者多个组件搭配@Configuration注解使用,交给spring容器管理* 该注解有三种方式* 1.@import:指定导入一个或者多个类* 2.ImportSelector:定义一个类实现该接口,重写selectImports方法* 3.* 扩展:@ImportResource:指定导入一个或者多个xml文件*/@Import(AutoConfigurationImportSelector.class)
public@interfaceEnableAutoConfiguration {
  • AutoConfigurationImportSelector类源码解析
// 重写来自于DeferredImportSelector.Group#process@Overridepublicvoidprocess(AnnotationMetadataannotationMetadata, DeferredImportSelectordeferredImportSelector) {
Assert.state(deferredImportSelectorinstanceofAutoConfigurationImportSelector,
                 () ->String.format("Only %s implementations are supported, got %s",
AutoConfigurationImportSelector.class.getSimpleName(),
deferredImportSelector.getClass().getName()));
// 获取自动装配信息AutoConfigurationEntryautoConfigurationEntry= ((AutoConfigurationImportSelector) deferredImportSelector)
        .getAutoConfigurationEntry(annotationMetadata);
this.autoConfigurationEntries.add(autoConfigurationEntry);
for (StringimportClassName : autoConfigurationEntry.getConfigurations()) {
this.entries.putIfAbsent(importClassName, annotationMetadata);
    }
}
// 获取自动装配信息protectedAutoConfigurationEntrygetAutoConfigurationEntry(AnnotationMetadataannotationMetadata) {
if (!isEnabled(annotationMetadata)) {
returnEMPTY_ENTRY;
    }
AnnotationAttributesattributes=getAttributes(annotationMetadata);
// 加载所有在META-INF/spring.factories中配置的类 跳到①List<String>configurations=getCandidateConfigurations(annotationMetadata, attributes);
configurations=removeDuplicates(configurations);
Set<String>exclusions=getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
// 经过condition注解过滤后的自动配置类configurations=getConfigurationClassFilter().filter(configurations);
fireAutoConfigurationImportEvents(configurations, exclusions);
returnnewAutoConfigurationEntry(configurations, exclusions);
}
// ① META-INF/spring.factories中读取所有的候选的自动配置类名称protectedList<String>getCandidateConfigurations(AnnotationMetadatametadata, AnnotationAttributesattributes) {
// 通过SpringFactoriesLoader读取所有的候选的自动配置类名称// ② 加载配置候选的类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.");
returnconfigurations;
}
// ③ 加载配置候选的类protectedClass<?>getSpringFactoriesLoaderFactoryClass() {
returnEnableAutoConfiguration.class;
}
// 所以如果想要将一个外部(第三方)的类交给spring容器管理,可以把这个类配置添加到META-INF/spring.factories文件中。// 例如自定义starter场景启动器
  • 总结:SpringBoot的自动装配原理本质上就是读取项目中所有的META-INF/spring.factories的配置类信息


  • @Import之 ImportSelector/ImportBeanDefinitionRegistrar扩展
// ImportSelector (重要!SpringBoot底层使用这种方式,但是又有区别)publicclassMyImportSelectorimplementsImportSelector {
@OverridepublicString[] selectImports(AnnotationMetadataimportingClassMetadata) {
// 返回值String[]中值依旧是要导入类的全限定名,注意,返回值可以是空数组但是不能为nullreturnnewString[]{"com.fun.bootdemo.custome.Demo1"};
    }
}
/*** SpringBoot底层使用的是:* org.springframework.boot.autoconfigure.AutoConfigurationImportSelector* 该类实现的是DeferredImportSelector接口,该接口包含有额外功能:* gruop 该分组可以用来进行排序和过滤时同时DeferredImportSelector是优先级比较低的,* 需要等到其他bean注册完了。才注册该接口导入的bean。这个功能很好的结合了@Conditon等条件注解* 实现了用户自定义配置覆盖默认配置*/// ImportBeanDefinitionRegistrarpublicclassMyImportBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrar {
@OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata, BeanDefinitionRegistryregistry) {
// 指定注册bean定义信息RootBeanDefinitionrootBeanDefinition=newRootBeanDefinition(Demo3.class);
// demo3 是beanNameregistry.registerBeanDefinition("demo3", rootBeanDefinition);
    }
}
// 测试 (在配置类上)@Import({MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})


相关文章
|
2月前
|
缓存 Java 开发者
【Spring】原理:Bean的作用域与生命周期
本文将围绕 Spring Bean 的作用域与生命周期展开深度剖析,系统梳理作用域的类型与应用场景、生命周期的关键阶段与扩展点,并结合实际案例揭示其底层实现原理,为开发者提供从理论到实践的完整指导。
|
2月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
|
29天前
|
安全 Java 决策智能
Spring Boot自动装配
Spring Boot自动装配基于“约定优于配置”理念,通过条件化配置与Starters机制,智能推断并加载所需组件,大幅简化开发流程。它实现配置自动化,提升效率,降低维护成本,支持自定义扩展,推动微服务快速构建,是Java生态中开发范式的革新之作。(238字)
|
1月前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
1月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
243 3
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
320 2
|
3月前
|
Java 关系型数据库 数据库
深度剖析【Spring】事务:万字详解,彻底掌握传播机制与事务原理
在Java开发中,Spring框架通过事务管理机制,帮我们轻松实现了这种“承诺”。它不仅封装了底层复杂的事务控制逻辑(比如手动开启、提交、回滚事务),还提供了灵活的配置方式,让开发者能专注于业务逻辑,而不用纠结于事务细节。
|
4月前
|
缓存 安全 Java
Spring 框架核心原理与实践解析
本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。 解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP
163 0
|
4月前
|
监控 架构师 NoSQL
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
spring 状态机 的使用 + 原理 + 源码学习 (图解+秒懂+史上最全)
深入实践springboot实战 蓄势待发 我不是雷锋 我是知识搬运工
springboot,说白了就是一个集合了功能的大类库,包括springMVC,spring,spring data,spring security等等,并且提供了很多和可以和其他常用框架,插件完美整合的接口(只能说是一些常用框架,基本在github上能排上名次的都有完美整合,但如果是自己写的一个框架就无法实现快速整合)。