SpringBoot自动配置

        SpringBoot定义了一套接口规范,这套规范规定:SpringBoot在启动时会扫描外部引用jar包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到Spring容器,并执行类中定义的各种操作,对于外部jar来说,只需要按照SpringBoot定义的标准,就能将自己的功能配置进SpringBoot。

      SpringBoot的核心注解SpringBootApplication  

查看源码,发现是一个组合注解,大概可以把@SpringBootApplication看作是@Configuration、@EnableAutoConfiguration、@ComponentScan注解的集合。

  • @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
  • @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  • @ComponentScan:扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。

@Configuration标注在某一个类上,表示这是个SpringBoot的配置类,相当于之前xml配置文件,可以给容器注入组件

@EnableAutoConfiguration:开启自动配置功能。自动导包和自动导入选择

@AutoConfigurationPackage:这个注解本身含义就是将主配置类(@SpringBootApplication标注的类)所在的包下面所有的组件扫描到spring容器中,包名都是主配置类的

@Import(AutoConfigurationImportSelector.class:自动配置导入选择

AutoConfigurationImportSelector开启自动配置类的导包的选择器

这个类中存在的方法可以帮助我们获取所有的配置

打断点,获取configurations的值

点开configurations,数组长度为134

注意看文件名,后缀全为......AutoConfiguration

将所有需要导入的组件以全类名的方式返回,并添加到容器中

最终会给容器中导入非常多的自动配置类(......AutoConfiguration),给容器中导入这个场景需要的所有组件,并配置好这些组件

有了自动配置类,免去了我们手动编写配置注入功能组件等工作

所有的配置都存放在configurations中,而这些配置都从getCandidateConfigurations方法中获取,

这个getCandidateConfigurations方法是用来获取候选的配置。

点进getCandidateConfigurations方法

getCandidateConfiguration方法返回的list,这个list其实是由loadFactoryNames返回的loadFactoryNames方法执行的时候传入了两个参数,一个参数为getSpringFactoriesLoaderFactoryClass(),还有一个参数就是EnableAutoConfiguration

先是将EnableAutoConfiguration.class传给了factoryType,然后.getName( ),所以factoryTypeName值为EnableAutoConfiguration

然后调用loadSpringFactories( )方法,并且从类路径下得到一个资源

而FACTORIES_RESOURCE_LOCATION已定义好

还有断言,configurations必须非空,否则就打印一段话,

这时,打开spring.faactories就会发现里面包含了很多自动配置类

这个文件下,EnableAutoConfiguration下面所有组件,每一个......AutoConfiguration类都是容器中的一个组件,都加入到容器中,加入到容器中之后的作用就是来做自动配置,这就是springboot自动配置的开始,只有这些自动配置类进入容器之后,接下来这个自动配置类才开始启动,那spring.factories中存放那么多的配置,每次加载启动时都是全部加载吗,那是不现实的。

        这时,@Conditional就根据不同的条件,来进行自己不同的条件判断,如果满足指定条件,那么整个配置类里面的配置才会生效。

① 定义条件类:自定义类实现Condition接口,重写 matches 方法,在 matches 方法中进行逻辑判 断,返回 boolean值 。

matches 方法两个参数:

• context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory等。

• metadata:元数据对象,用于获取注解属性。 ② 判断条件: 在初始化Bean时,使用 @Conditional(条件类.class)注解

SpringBoot 提供的常用条件注解:注解在springBoot-autoconfigure的condition包下

• ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean

• ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean

• ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean

• ConditionalOnBean:判断环境中有对应Bean才初始化Bean

这些条件注解使得 Spring Boot 的自动配置能够更加智能和灵活,根据项目的实际情况来决定是否应用某些配置,从而避免不必要的资源消耗和冲突。

        总的来说:启动类中有一个@SpringBootApplication注解,包含@EnableAutoConfiguration代表开启自动装配,@EnableAutoConfiguration注解会去spring-boot-autoconfigure工程下寻找 META-INF/spring.factories 文件,这个文件中列举了所有自动装备类的清单,有一百多个,然后自动读取里面的自动装配配置类清单。但是这些类不会全部加载,很显然这样非常不合理。但是因为有@ConditionalOn条件注解,满足一定条件配置才会生效 如: @ConditionalOnClass(某类.class) 工程中必须包含一些相关的类时,配置才会生效所以说当我们的起步依赖中引入了一些对应的类之后,自动装备的条件满足了,自动装备才会被触发。

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值