SpringBoot的自动配置原理和Starter机制

一:springboot自动配置原理
1:在SpringBoot主启类上面添加的SpringBootApplication是一个复合(派生)注解,里面有
很多很重要的注解,像@SpringBootConfiguration,他的作用是将SpringBoot主启动类标记为一个配置类,

2:@ComponetScan(默认扫描主启动类所在的包以及所在包的子包标识了注解的类,将他们注册到IOC容器中

3:@EnableAutoConfiguration这个注解也是一个派生注解,它里面有一个很重要的注解就是@import注解,这个注解导入了一个AutoConfigurationImportSelector类,这个类是ImportSelector类的一个子类,它里面有一个方法为selectImports(),这个方法的返回值类型是一个String类型的字符串,它的作用就是获取META-INFO目录下的spring.factories文件下的自动配置类的群全限定名,(这里稍微说一下,spring.factories文件下的数据存储的格式为key-value的形式,其中,key为EnableAutoConfiguration类的全限定名,value为xxxAutoConfiguration的全限定名列表,中间用,隔开)当主启动类启动的时候,就会执行selectImoprts()方法得到类的全限定名,然后将这些配置类注册到IIOC容器中去,然后IOC容器解析这些类得到对应的.class,最后通过反射机制创建对象。

注意:不是所有的配置类都会被注册到IOC容器中,配置类的生效也会受某些条件限制,比如

@ConditionalOnClass,@ConditionalNotOClass...所以从这个出发点触发,也可以引入SpringBoot是starter机制

二:SpringBoot的starter机制

在SpringBoot中,通过maven工具引入一个starter包时候,首先,starter包可以理解成是一组依赖的集合,本质上是引入了集合中这些依赖的jar包,当然,在这些jar包下的META-INFO目录下有的有spring.factories文件,有的没有这个文件,当你引入这些jar包的时候,这些jar包目录下面会有很多的类,通过这些类的引入,这不就是相当于打破了上面说的某些自动配置类的限制了吗,这样的话,相应的自动配置类就会加载到IOC容器中了,这就是starter机制。

如果你还是不懂,我举个例子,假如你没有引入spring-boot-starter-jdbc的时候,你的jdbc自动配置是不会加载到容器中的,因为存在配置类生效的限制,例如

 我以数据源的这个自动配置类为例子,

@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})这个注解,他的意思就是需要有DataSource和EmbeddedDatabaseType这两个类这个自动配置才能生效,那么这两个类从哪里来呢?不就是从spring-boot-starter-jdbc这个包下的jar包里来吗,如果你不引入这个starter包,那么你就无法去操作数据库了(当然如果你自己写这些类通过maven工具打成jar包的话当我没说)这你就知道了starter机制的原理了吧。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值