Spring Boot自动配置

SpringBoot通过@EnableAutoConfiguration注解开启自动配置

SpringBoot的标准启动入口如下:
@SpringBootApplication
public class GraduationProjectApplication {
    public static void main(String[] args) {
        SpringApplication.run(GraduationProjectApplication.class, args);
    }
}

通过标准启动入口的代码可以看出,Springboot启动类的核心注解是@SpringBootApplication。

@SpringBootApplication源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
/**
 * 继承自@Configuration
 * 标注在类上表示这是一个SpringBoot的配置类,允许在上下文中注册额外的bean或者导入其他配置项
 **/
@SpringBootConfiguration
/**
 * 开启自动配置功能
 * 主要包含两个注解:@AutoConfigurationPackage、@Import
 **/
@EnableAutoConfiguration
/**
 * 自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中 
 **/
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)

自动配置具体实现步骤:

  1、SpringBoot启动的时候加载主启动类,通过@EnableAutoConfiguration开启自动配置功能。

  2、@EnableAutoConfiguration利用AutoConfigurationImportSelector给容器中导入一些组件。

  3、通过protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)获取候选的配置和核心方法,扫描所有jar包类路径下"META-INF/spring.factories",通过@AutoConfigurationPackage自动配置包。

  4、把扫描到的文件包装成Properties对象。

  5、从properties中获取到EnableAutoConfiguration.class类名对应的值,并把他们添加在容器中。

  6、整个过程就是将类路径下"META-INF/spring.factories"里面配置的所有EnableAutoConfiguration的值加入到容器中。

  7、根据@Conditional注解中的条件判断,决定这个配置是否生效。

  8、初始化Bean,自动配置完成。

总结

  SpringBoot通过@EnableAutoConfiguration开启自动配置,通过 SpringFactoriesLoader 最终加载META-INF/spring.factories中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional按需加载的配置类。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×