spring自动配置原理
配置文件的种类
properties文件
yml文件
yaml文件
java系统属性-Dsever.port
命令行参数--Sever.port
后两种主要用于在项目打包之后临时覆盖配置文件
优先级
命令行参数>java系统属性>properties文件>yml文件>yaml文件
如何获取Bean对象
可以利用IOC容器中的对象ApplicationContext调用其getBean()方法来获取指定Bean对象
Ioc容器中的对象是在什么时候创建的
在springboot程序启动时就创建并储存
可以使用@Lazy注解来延迟初始化
Bean对象的作用域
默认是单例,可以利用@Socpe("")注解配置其作用域
singleton(默认情况单例)
singleton(表示多例bean每一次使用就创建一个)
后面三种只在web环境下才有
还有request每次请求范围创建一个
session每次会话范围创建一个
application每次应用范围会创建一个
什么是第三方Bean
第三方Bean是指由第三方提供jar包中的对象,将其创建对象的权利交给spring管理,储存在IOC容器中.
如何声明第三方Bean
在@configration注解声明的配置类中利用@Bean注解在方法中声明并将Bean对象return给spring
@Bean 被声明的方法会被spring 调用,方法返回值会保存到ioc容器中,默认名称时方法名
若要管理第三方bean对象,建议集中分配管理,利用@configration声明一个配置类来管理
如果声明第三方Bean时需要依赖其他Bean对象可以在定义方法中设置形参,由spring将ioc容器中的Bean自动注入
@Conponent注解和@Bean注解的区别
@Component及其衍生注解是将自定义类对象交给ioc容器管理
@Bean是将jar包中的类交给ioc容器管理
Springboot的起步依赖原理
借助maven中依赖传递的特性,把常用依赖通过stater依赖传递进来
如果a依赖了b,b依赖了c,那么a间接依赖了c
如何实现自动配置
两种方案
1.利用@ConponentScan扫描批量注册
流程:
引入第三方依赖,
在启动类使用@ConponentScan扫描批量注册,指定扫描的包及其子包下的配置类
利用@Bean注解在启动类中将指定第三方Bean导入IOC容器中
2.利用@import注解实现自动配置
流程:
引入第三方依赖
在启动类中利用@Impor注解导入普通类,配置类,importSelect接口实现类(导入器)
普通类:将普通类作为Bean对象导入IOC容器中
配置类:将配置类中的Bean对象导入IOC容器中
importSelect接口实现类(导入器):导入器会调用内部的SelectImport方法封装并返回配置类全类名字符串数组,并将其中的配置文件中的Bean对象导入IOC容器中
springboot自动配置原理
spring要导入哪些配置类,由第三方自己指定,第三方通过自定义EnablexxxConfigru注解实现@improt注解传入导入器实现类来指定哪些陪着类或Bean要导入IOC容器中
Conditional条件注解
满足条件spring才会创建对应bean对象到ioc容器中
ConditionalOnClass当程序中有指定字节码对象,才创建
ConditionalOnMissBean当程序中没有指定Bean对象,才会创建,通过Value属性指定类型,name属性指定名称
总结:
在每一个spring程序的启动类中都有一个@springbootApplication注解,其内部使用@Enable
AutoConfiguration注解开启自动配置
在@EnableAutoConfiguration内部使用import注解通过importSelect导入其实现类批量加载自动配置包文件中的配置类
在具体加载过程中是导入器会读取到自动配置包MEAT-INF/spring/spring.factories文件,获取文件中定义的配置类全类名,判断条件是否满足,满足就创建对应Bean对象保存在IOC容器中
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!