SpringBoot3.0.2自动装配实现方式源码分析

I. 为什么用SpringBoot而不是SpringFramework ?

SpringFramework 依赖繁琐, 配置麻烦.

SpringBoot 提供起步依赖, 自动完成依赖和配置, 引导类自带扫描包的功能, 更加简单快捷, 可以提高开发效率. 底层还是IOC和AOP

II. 起步依赖原理

起步依赖: 通过依赖传递的方式简化了依赖的导入, 只需要导入父依赖就会自动导入其下所有需要使用的依赖.

版本锁定: SpringBoot在官方提供的父依赖中定义好了子依赖的版本, 避免了依赖版本冲突问题. 但是第三方依赖需要自己检查版本适配.

III. 自动化配置原理

SpringBoot的自动配置就是当spring容器启动后, 一些配置类, bean对象就自动存入到了IOC容器中, 不需要我们手动去声明, 从而简化了开发, 省去了繁琐的配置操作.

在调用对象的构造方法时, 对象会使用@Bean注解自动注册bean到IOC容器中, 供SpringBoot的组件扫描并调用, 从而自动实现初始化.

实现方案: 

最初的 @Component+包扫描方法

引入依赖后并基于@Component和其衍生注解声明bean并不一定会被扫描到. 还需要使用@ComponentScan组件扫描注解, 手动扫描引入的第三方依赖中的bean.

但是这样会导致导入多个依赖时需要手动扫描多个依赖, 过于繁琐麻烦.

优化后通过@Import导入, 使用@Import导入的类会被Spring加载到IOC容器中, 有以下实现方式:

@Import导入方式: 

1.导入普通类

@Import(类名.class) 导入的类会被Spring加载到IOC容器中

2.导入配置类

在配置类中使用@Bean注解注册类为bean对象, 再在启动类中使用@Import(配置类名.class)注解导入配置类

3.使用@Import导入ImportSekector接口实现类

自己写一个类实现ImportSelector接口, 实现的selectImports方法返回的是封装了全限定名称的类的字符串数组. 再在启动类中使用@Import注解导入ImportSelector的接口实现类.

使用以上三种方式都可以导入第三方依赖中提供的bean或配置类, 但是还需要知道第三方依赖中存在的配置类和Bean对象, 这就导致程序员需要指定导入第三方依赖中的bean对象和配置类, 太繁琐太麻烦了.

4.@EnableXxxx最优雅简单的方式:

使用第三方提供的@EnableXxxx注解, 由第三方指定依赖中需要导入的bean对象和配置类, 封装@Import注解.

只需要在启动类上加上@EnableXxxx注解就可以使用

IV. 自动装配原理分析

首先我们从SpringBootApplication注解开始分析:

@SpringBootConfiguration: 底层是@Configuration注解, 这表示当前引导类也是一个配置类:

 @EnableAutoConfiguration: 底层是一个@Import注解, 会导入AutoConfigurationImportSelector配置类.

 @ComponentScan: 我们主要看selectImports方法和getAutoConfigurationEntry里的getCandidateConfigurations方法

getCandidateConfigurations方法会获取项目下所有jar包中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports下所有配置类信息,把key为EnableAutoConfiguration的值列表加载进内存.

V.引导类的run方法实现自动装配

VI. 总结

启动类通过复合注解@SpringBootApplication中的@SpringBootConfiguration(底层是@Configuration)表示启动类本身也是配置类, 可以在启动类中定义Bean; 通过@ComponentScan组件扫描注释, 扫描启动类包及其子包下能被Spring识别的组件; 通过@EnableAutoConfiguration(底层是@Import)导入AutoConfigurationImportSelector类的selectImports方法, 加载META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中的内容, 筛选满足starter和各种Conditional条件的全类名后, 封装成字符串数组, 加载到内存中.

启动类再通过run方法去创建并初始化Spring容器, 在初始化期间会把上面的字符串数组对应的内容创建成对象注入到Spring容器, 从而实现自动化装配.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值