自动装配【SpringBoot】
简介
Ioc是Spring框架的核心机制之一,Ioc的设计理念是将系统中的Bean进行全生命周期统一的管理,Bean的声明周期包括Bean的定义,配置,创建,初始化,销毁等。
为了实现Spring的Ioc机制,spring需要处理Bean之间的依赖关系,最初这些依赖关系依靠配置文件进行管理,但是这些配置信息非常冗长,难以维护。
为了减少配置信息,Spring框架提出了声明式的Bean定义,声明式的Bean定义会对Bean的依赖关系进行自动分析以及自动装配。
spring自动装配通过注解@Autoware实现,自动装配的方式分为如下几种:
装配类型 | 名词解释 |
---|---|
byType | 根据类型装配 |
byName | 根据Bean的名称装配 |
constructor | 根据构造器装配 |
autodetect | 自动检测,依次按照constructor和byType进行自动装配,即有构造函数的时候按照构造函数装配,否则按照类型装配。 |
Spring解决了Bean的自动装配,SpringBoot中的自动装配机制更加专注于组件。
组件即实现了某种能力的一个模块。常见的sping组件有缓存模块,例如Cache组件,链接池组件等,组件通常使用三方jar包的方式提供,SpringBoot的自动装配机制可以将这些组件的Bean自动装配到Spring框架的Bean工厂中。
原理
SpringBoot中的自动装配机制分为几个模块,装配入口,装配实现一机装配的时机。
装配入口
@EnableAutoConfiguration是SpringBoot框架中实现自动装配的核心注解,该注解是一个复合注解,该注解上的@Import(AutoConfigurationImportSelector.class)注解是自动装配核心的执行部分。
AutoConfigurationImportSelector类会扫描ClassPath下所有jar包的spring.factories。
spring.factories配置了可以被自动加载的组件,这些组件一般是以**AutoConfiguration的方式命名。
装配实现
实现自动装配机制的组件,在AutoConfiguration类中需要补齐自身的依赖资源以及配置。
装配时机
spring.factories中可以加载的组件较多,SpringBoot框架提供了按需加载的机制,可以通过以下的规则定义加载条件。
- @ConditionalOnBean:当容器里有指定Bean的条件下
- @ConditionalOnClass:当类路径下有指定的类的条件下
- @ConditionalOnExpression:基于SpEL表达式为true的时候作为判断条件才去实例化
- @ConditionalOnJava:基于JVM版本作为判断条件
- @ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
- @ConditionalOnMissingBean:当容器里没有指定Bean的情况下
- @ConditionalOnMissingClass:当容器里没有指定类的情况下
- @ConditionalOnWebApplication:当前项目时Web项目的条件下
- @ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
- @ConditionalOnProperty:当前项目是否配置了该属性
- @ConditionalOnResource:类路径是否有指定的值
- @ConditionalOnOnSingleCandidate:当指定Bean在容器中只有一个,或者有多个但是指定首选的Bean