hooyantsing's Blog

白银篇_P1_结合源码讲解bean自动装配原理

字数统计: 558阅读时长: 2 min
2020/07/16

结合源码讲解bean自动装配原理

20年全新-Spring Boot 2.x从青铜到王者之白银篇-打造精品中的精品-程序员-编程-架构师-SpringBoot

fc9a5ea765fa24b219b76c4863120f69.png

探究

点击 @SpringBootApplication 注解查看内部,@EnableAutoConfiguration 注解是用于自动装载的行为,相当于自动装载的开关。

5f2f97c607eed35daa9a0961dce935bc.png

spring.factories 文件内包含自动装配的类信息。

自动装配类里面是如何完成装配的

打开 spring.factories ,按住 Ctrl 键点击随便的一个类名,进入这个类。

可以看到以 @ConditionOn 起头的注解,这些是条件注解。只有满足所有的@ConditionOn起头的注解,才自动装配当前这个类。

举几个例子:

@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) 项目当前运行环境,必须是Servlet容器。6b2376facd8770ec069cb73b2bcfb5dd.png

除了servlet容器,还有”spring webflux”。

@ConditionOnClass(CharacterEncodingFilter.class) 当前类的字节码文件存在。

@ConditionOnProperty(prefix = "server.servlet.encoding" , value = "enabled" , matchIfMissing = true) 有 server.servlet.encoding 这样的一个配置,并且配值 enabled 等于 true 。

  • matchIfMissing 表示默认值
    |@ConditionOnClass |classpath中存在该字节码文件时,才执行实例化方法或将类实例化 |
    |@ConditionOnMissingClass |classpath中不存在该类字节码文件时,才执行实例化方法。(不存在A的时候去初始化B)|
    |@ConditionOnBean |DI容器中存在该类型Bean时,才执行实例化方法或将类实例化 |
    |@ConditionOnMissingBean |DI容器中不存在该类型Bean时,才执行实例化方法或类实例化 |
    |@ConditionOnSingleCandidate |DI容器中该类型Bean只有一个或@Primary的只有一个时,才执行实例化方法或类实例化 |
    |@ConditionOnExpression |SpEL表达式结果为true时,才执行实例化方法或类实例化 |
    |@ConditionOnProperty |参数设置或者值一致时,才执行实例化方法或类实例化 |
    |@ConditionOnResource |指定的文件存在时,才执行实例化方法或将类实例化 |
    |@ConditionOnJndi |指定的JNDI存在时,才执行实例化方法或类实例化 |
    |@ConditionOnJava |指定的Java版本存在时,才执行实例化方法或类实例化 |
    |@ConditionOnWebApplication |Web应用环境下,才执行实例化方法或将类实例化 |
    |@ConditionOnNotWebApplication|非Web应用环境下,才执行实例化方法或将类实例化 |
CATALOG
  1. 1. 结合源码讲解bean自动装配原理
    1. 1.0.1. 探究
    2. 1.0.2. 自动装配类里面是如何完成装配的