SpringBoot框架如何实现自动分配

一、什么是自动装配?

定义:SpringBoot的自动装配是指它能够根据应用程序的依赖和环境,自动决定应该应用哪些配置装配哪些Bean,而无需开发者手动进行繁琐的配置。

SpringBoot自动装配的优点:
简化配置:自动装配机制能够根据应用程序的依赖和环境自动配置所需的组件,避免了繁琐的手动配置过程。
减少出错:由于自动装配是基于条件化配置的,因此可以避免手动配置过程中出现的错误和疏漏。
提高效率:自动装配机制能够显著提高开发效率,使开发者能够更专注于业务逻辑的实现。

总结:当开发者使用了SpringBoot开发系统后,伴随着自动装配的优点,开发者就不用在意配置文件的编写,更注重于业务的实现。

二、实现自动装配用到的注解

1.@Condition:
在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作。
在这里插入图片描述
在这里插入图片描述
@ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
@ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
@ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean
@ConditionalOnBean:判断环境中有对应Bean才初始化Bean
value值用来写判定条件,当成立时将对象加载到spring容器中,不成立则不加载。

2.@Enable
SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态启用某些功能的。而其底层原理是使用@Import注 解导入一些配置类,实现Bean的动态加载
在这里插入图片描述
可以从源码中发现,@Enable注解就是使用@import注解,而@import注解通常有以下四个用法:
在这里插入图片描述
3.EnableAutoConfigurtion主启动类

//@SpringBootApplication 来标注一个主程序类
//说明这是一个Spring Boot应用
@SpringBootApplication
public class SpringbootApplication {
public static void main(String[] args) {
//以为是启动了一个方法,没想到启动了一个服务
SpringApplication.run(SpringbootApplication.class, args);
}
}

主启动类的内部:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
// ......
}

以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置 ;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;

三、SpringBoot自动装配的实现原理

1.@SpringBootApplication是SpringBoot项目的主配置类,程序运行以及加载Bean对象都从SpringApplication.run()开始。
在这里插入图片描述
2.自动装配注解。代表自动装配
在这里插入图片描述
3.导入AutoConfigurationImportSelector类,进行自动装配的选择。
在这里插入图片描述
4.将自动装配的对象的list集合通过AutoConfigurationImportSelector类中的getAutoConfigurationEntry方法进行扫描返回。
在这里插入图片描述
5.扫描的getAutoConfigurationEntry方法中,去项目的所有目录的"META-INF/spring.factories"目录中扫描自动配置类。

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));
        ImportCandidates.load(AutoConfiguration.class, this.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;
    }

6.将扫描的配置类以Map<String, List>的形式返回,键为工厂的名称,值为配置类的集合。
在这里插入图片描述
蓝色代表工厂
绿色代表集合

四、总结

Spring Boot 通过@EnableAutoConfiguration开启自动装配,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类,想要其生效必须引入spring-boot-starter-xxx包实现起步依赖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值