栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot-浅谈自动装配

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot-浅谈自动装配

SpringBoot是一个高度封装的框架,我们只需要按照规则导入相关依赖,springboot就能给配置好默认的值以及常用的组件功能,如果我们熟悉自动装配的原理,那我们也能够随心所欲的根据自己的需求来配置SpringBoot环境了

SpringBoot是如何完成这些操作的呢? 一、来看到我们的启动类


我们可以看到@SpringBootApplication注解,点进去

我们可以看到这个注解是一个合成注解,除了元注解以外还使用了@SpringBootConfiguration、@EnableAutoConfiguration以及@ComponentScan这三个注解。

1、@SpringBootConfiguration

@Configuration。代表当前是一个配置类

2、@ComponentScan

指定扫描哪些包有Spring注解;

3、@EnableAutoConfiguration
@AutoConfigurationPackage
@import(AutoConfigurationimportSelector.class)
public @interface EnableAutoConfiguration {}

这个注解是完成自动配置的核心部分,我们来点看AutoConfigurationimportSelector.class这个类

1、利用getAutoConfigurationEntry(annotationmetadata);给容器中批量导入一些组件
2、调用List configurations = getCandidateConfigurations(annotationmetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从meta-INF/spring.factories位置来加载一个文件。
	默认扫描我们当前系统里面所有meta-INF/spring.factories位置的文件
    spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有meta-INF/spring.factories

我们来看看 spring-boot-autoconfigure-2.3.4.RELEASE/meta-INF/spring.factories文件

# Initializers
org.springframework.context.ApplicationContextInitializer=
org.springframework.boot.autoconfigure.SharedmetadataReaderFactoryContextInitializer,
org.springframework.boot.autoconfigure.logging.ConditionevaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configuration import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationimportListener=
org.springframework.boot.autoconfigure.condition.ConditionevaluationReportAutoConfigurationimportListener

# Auto Configuration import Filters
org.springframework.boot.autoconfigure.AutoConfigurationimportFilter=
org.springframework.boot.autoconfigure.condition.OnBeanCondition,
org.springframework.boot.autoconfigure.condition.OnClassCondition,
org.springframework.boot.autoconfigure.condition.onWebApplicationCondition

.......//省略下面类似片段

SpringBoot就是根据这个配置文件来加载该模块的自动配置类的

二、按需开启自动配置项 我们来看SpringMVC中上传文件的autoconfiguration类

虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration
按照条件装配规则(@Conditional),最终会按需配置。

@Configuration
@ConditionalOnClass({Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class})
@ConditionalOnProperty(
    prefix = "spring.servlet.multipart",
    name = {"enabled"},
    matchIfMissing = true
)
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({MultipartProperties.class})
public class MultipartAutoConfiguration {
    private final MultipartProperties multipartProperties;

    public MultipartAutoConfiguration(MultipartProperties multipartProperties) {
        this.multipartProperties = multipartProperties;
    }

    @Bean
    @ConditionalOnMissingBean({MultipartConfigElement.class, CommonsMultipartResolver.class})
    public MultipartConfigElement multipartConfigElement() {
        return this.multipartProperties.createMultipartConfig();
    }

    @Bean(
        name = {"multipartResolver"}
    )
    @ConditionalOnMissingBean({MultipartResolver.class})
    public StandardServletMultipartResolver multipartResolver() {
        StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
        multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
        return multipartResolver;
    }
}
@Configuration:表明该类为配置类
@ConditionalOnClass({Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class}):
若Servlet、StandardServletMultipartResolver、 MultipartConfigElement有一个不生效,则该配置类不生效
@ConditionalOnProperty(
    prefix = "spring.servlet.multipart",
    name = {"enabled"},
    matchIfMissing = true
):前两个属性代表在application配置文件中存在前缀spring.servlet.multipart才生效,但matchIfMissing = true表示若没匹配上也生效
@ConditionalOnWebApplication(
    type = Type.SERVLET
)
@EnableConfigurationProperties({MultipartProperties.class}):表示加载这个属性类并讲它导入到容器当中

从上述代码可以看出来,autoconfiguration类生产bean总是依赖于属性类的,我们来看看属性类

我们看到,属性类的属性是根据我们配置文件来进行配置的。

总结
  1. 在SpringBoot启动时,首先会根据meta-INF/spring.factories文件来导入全部自动配置类
  2. 自动配置类按照@condition注解来决定是否生效。
  3. 自动配置类中的bean会根据条件(比如容器中是否有同类型的bean)决定是否生效
  4. 自动配置类中生效的bean默认都会绑定配置文件指定的值。(先从xxxxProperties里面拿。而xxxProperties和配置文件进行了绑定,若配置文件也没有则使用默认值)

xxxxxAutoConfiguration —> 组件(给用户使用的) —> xxxxProperties里面拿值 ----> application.properties

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/659321.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号