Springboot自动装配原理(pom.xml配置解析,项目自动化原理的实现流程)
创始人
2025-05-31 20:52:26
0

安装一个Springboot项目

先从pox.xml中配置进行理解

依赖一:

  org.springframework.bootspring-boot-dependencies2.7.9

依赖中的父类中的父类(最顶层): 存放着所有项目工程所能够使用的依赖版本

 依赖二:项目启动器

        org.springframework.bootspring-boot-starter-web

注意:项目启动的环境有很多,只需要修改下面的xxxx内容即可

spring-boot-starter-XXXX

例如:log4j,web,jdbc,aop等等

如果导入这种依赖就会自动将该项目中使用的自动导入依赖,减少了在spring系列各种配置文件的配置流程,极大的解放了双手,通过项目中本身所搭配的环境,来实现代码的运行。

在spring boot框架中有很多很多自动配置类,他都存放在一个已经打包完成的spring jar包中,所有的自动配置类放在次jar包内,只需要进行调用即可

 

自动配置实现流程: 上面说的是自动配置类存放的位置,接下来我们需要去调用spring.factories中的自动配置类,将标注注解为@configuration的配置类进行反射实例化,并将这些汇总到一个IOC容器中在项目中进行使用。

自动装配配置注解

@SpringBootApplication注解主配置类程序的主入口,开启项目的钥匙

那么凭什么这一个注解就可以打开spring boot项目的呢?

打开注解,看下面三个注解,这三个注解为@SpringBootApplication提供了大部分的功能,当然这么牛逼的注解不光只有这几个注解,

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited

上面这四个注解则是生成注解必不可少的一部分,只要是注解就必不可少的一部分吧。但是对与自动装配却是无关紧要。

@SpringBootConfiguration

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package org.springframework.boot;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Indexed;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;
}

点进去,我们发现了一个特别熟悉的注解@Configuration ,主要实现的作用的则是,将当前类组为一个配置类相当于spring中的配置文件,将此类交给spring中ioc容器进行统一的管理

注意:在理论意义上spring boot是在spring进行的不断地框架化,它保留了在spring项目中能够使用得到大部分功能,所以注解就可以直接拿来进行用。

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class)

@ComponentScan

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package org.springframework.context.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.core.annotation.AliasFor;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {@AliasFor("basePackages")String[] value() default {};@AliasFor("value")String[] basePackages() default {};Class[] basePackageClasses() default {};Class nameGenerator() default BeanNameGenerator.class;Class scopeResolver() default AnnotationScopeMetadataResolver.class;ScopedProxyMode scopedProxy() default ScopedProxyMode.DEFAULT;String resourcePattern() default "**/*.class";boolean useDefaultFilters() default true;ComponentScan.Filter[] includeFilters() default {};ComponentScan.Filter[] excludeFilters() default {};boolean lazyInit() default false;@Retention(RetentionPolicy.RUNTIME)@Target({})public @interface Filter {FilterType type() default FilterType.ANNOTATION;@AliasFor("classes")Class[] value() default {};@AliasFor("value")Class[] classes() default {};String[] pattern() default {};}
}

 @ComponentScan这个注解是不是看着有一丝熟悉,如果你学过spring或者springmvc你在看这个注解就会感到见过,在spring项目地配置文件中,你是否配置过这样的一行代码

 context:component-scan 对,不错这个注解实现地就是扫描项目中配置地那些类,亦可以说添加@Component,@Service,@Controller 等注解的类。

上面的两个注解起到的环境搭配的作用,要是想要实现自动装配,靠的还是注解

@EnableAutoConfiguration   auto便表示自动化的意思,这个注解则是实现自动化的关键所在

打开这个注解,注解内部主要的功能代码则是上面的这两部分 ,这两行则是spring boot自动化配置的核心。

@Import:导入类,在实际开发过程中,如果你定义一个类并为这个类添加了应有的配置,那这个类就一定能够被扫描到,然后在注入吗?答案是否定的,我们并不能确定创建的类一定被到的使用,但是@Import则可以替我们保证,由它导入的实体类可以被调用。

添加这个注解主要为了导入AutoConfigurationImportSelector.class,为了确保这个类,能够被调用通过注解进行注入,那么由此可以看出,这个类在实现自动化中发挥着一个怎样的作用了!!!

看一下这个类实现的具体流程

前提我们先了解以下一些其他的信息,在进行类中代码的讲解

AutoConfigurationImportSelector.class

1:AnnotationMetadata是用来访问指定类上的注解,获取元数据

AnnotationMetadata 存在两个实现类分别为 StandardAnnotationMetadata与 AnnotationMetadataReadingVisitorStandardAnnotationMetadata主要使用 Java 反射原理获取元数据,而 AnnotationMetadataReadingVisitor 使用 ASM 框架获取元数据。

类中的方法一:获取数据,如果有则要自动开启自动配置如果没有数据则调用

getAutoConfigurationEntry(annotationMetadata);方法

public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {private static final AutoConfigurationEntry EMPTY_ENTRY = new AutoConfigurationEntry();private static final String[] NO_IMPORTS = {};private static final Log logger = LogFactory.getLog(AutoConfigurationImportSelector.class);private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude";private ConfigurableListableBeanFactory beanFactory;private Environment environment;private ClassLoader beanClassLoader;private ResourceLoader resourceLoader;private ConfigurationClassFilter configurationClassFilter;@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}

如果方法一中没有元数据,则需要调用此方法 getAutoConfigurationEntry

方法二: getAutoConfigurationEntry

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return EMPTY_ENTRY;}AnnotationAttributes attributes = getAttributes(annotationMetadata);List configurations = getCandidateConfigurations(annotationMetadata, attributes);configurations = removeDuplicates(configurations);Set exclusions = getExclusions(annotationMetadata, attributes);checkExcludedClasses(configurations, exclusions);configurations.removeAll(exclusions);configurations = getConfigurationClassFilter().filter(configurations);fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationEntry(configurations, exclusions);}

这个方法里面就是通过调用getCandidateConfigurations 来获取候选的 Bean,并将其存为一个集合,最后经过去重,校验等一系列操作之后,被封装成 AutoConfigurationEntry 对象返回。

方法三: getCandidateConfigurations()

	protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {List configurations = new ArrayList<>(SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()));ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader()).forEach(configurations::add);Assert.notEmpty(configurations,"No auto configuration classes found in META-INF/spring.factories nor in META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "+ "are using a custom packaging, make sure that file is correct.");return configurations;}

通过方法三调用方法四:

getSpringFactoriesLoaderFactoryClass()

	protected Class getSpringFactoriesLoaderFactoryClass() {return EnableAutoConfiguration.class;}

自动化具体流程:

项目启动时,会从spring.factories获取EnableAutoConfiguration中的数据值➡获取自动配置数据,会将这些数据导入到容器中,自动配置类就会生效,搭配自动化环境➡jar包autoconfigure存放着自动配置,他会将配置和组件全都被添加到容器中➡当组件和配置全都被搭配好,就可以直接使用自动化无需在进行手动配置了

相关内容

热门资讯

原创 和... 抵达南昌的瞬间,那扑面而来的烟火气仿佛将我们紧紧包围。街头巷尾,叫卖声此起彼伏,小吃摊琳琅满目,令人...
潮汕参团两日游人均费用多少,去... 前段时间,我一直心心念念着去潮汕旅游,那片充满历史韵味与美食诱惑的土地,像磁石一般吸引着我。终于,在...
档期已排满:单日收入3000,... 综合自微博@央视新闻、@央视网、@央视财经、@中新视频、@新周刊等 中国入境游市场自2023年疫情政...
端午假期“余额”不足,返程攻略... 您的端午假期“余额”不足 且无法“充值”...... 假期的时光总是这么短暂 不知不觉中 端午假期...
宜昌三峡亲子三日游攻略:三天要... 宜昌三峡,那是一幅流动的山水画卷,自古以来就吸引着无数文人墨客和游客。这里既有壮美的自然风光,又有深...
五一假期文旅市场观察:当小县城... 怎么说呢,今年五一假期的旅游数据一出来,直接把我看懵了。你懂的,就是那种"这还是我认识的中国旅游市场...
探索巴彦淖尔周边自驾游:畅游自... 说到自驾游,很多人都会想到那些风景如画的热门景点,然而,在中国的西北部,有一个地方,它以其独特的自然...
情侣与一家三口在迪士尼打架,上... 刚刚,@警民直通车-浦东 发布微博:2025年5月31日18时许,浦东公安分局接报警称迪士尼乐园内有...
宜昌三峡三日游旅行团报价,和闺... 宜昌三峡,这片充满诗意与壮美的土地,一直是无数旅行者心驰神往的旅游胜地。它以雄伟的山脉、秀丽的江水、...
淄川生态村里游客多 淄川生态村... 5月28日,游客正在淄博市淄川区太河镇下端士村采摘甜杏。位于峨庄古村落国家森林公园里的下端士村地处深...
潮汕最佳5天4晚详细旅游攻略,... 潮汕,这片位于广东省东部的神秘土地,以其悠久的历史、独特的文化和令人垂涎的美食而闻名遐迩。无论是漫步...
粉肠鲜嫩秘诀:这样做,让你爱不... 粉肠作为一道传统的中华美食,因其独特的口感和鲜美的味道而深受喜爱。然而,很多人在制作粉肠时,总是难以...
炒牛肉又老又柴?腌制方法对了,... 每次下馆子吃到滑嫩如豆腐的炒牛肉,是不是总怀疑厨师偷偷给肉片施了魔法?今天咱们就揭开这个厨房秘密——...
夏日犯困没精神?建议中老年人常... 夏日炎炎,中老年人常常会感到犯困、没精神,身体的乏力感也随之而来。其实,通过合理的饮食调理,可以有效...
北京小众玩法推荐|4天3晚路线... 北京,这座古老与现代交织的城市,总是以其独特的魅力吸引着世界各地的游客。作为中国的首都,北京不仅拥有...
夏天到了,没食欲,6道超下饭的... 01 豆角炒鸡蛋 厨房小白版:食材:长豆角,鸡蛋,蒜制作步骤:1. 处理食材:长豆角洗净切丁,鸡蛋...
“饼” 纷世界:台湾手抓饼与天... 在美食的江湖里,有两款饼堪称 “话题担当”,它们模样相似,口感相近,却有着截然不同的身世,这便是台湾...
长春又一夜市正式营业 复古灯牌鳞次栉比、 各种烧烤香味扑鼻、海盗船 大秋千惊险刺激 …… 5月30日晚, 集美食、文创、娱...
分享3道既能减脂又下饭的家常菜... 减脂期总与"寡淡无味"挂钩?其实,低卡与美味从来不是对立面。今天分享的三道家常菜,用精准的食材搭配和...
海口市秀英区火山荔枝季农文旅市... 火山荔枝王遇海浪,一口鲜爽过端阳。5月31日,伴着浓浓的粽香氛围,迎着徐徐海风,海口市秀英区火山荔枝...