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) 工程中必须包含一些相关的类时,配置才会生效。所以说当我们的起步依赖中引入了一些对应的类之后,自动装备的条件满足了,自动装备才会被触发。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » SpringBoot自动配置
发表评论 取消回复