自动装配【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自动装配流程

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