springboot自动配置原理

启动类

package com.liouwb.springbootdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author liouwb
 */
@SpringBootApplication
public class SpringbootDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootDemoApplication.class, args);
    }

}

启动类只有@SpringBootApplication注解和一个main方法

  • @springBootApplication注解,说明这是一个Spring Boot应用

@SpringBootApplication 注解

  • SpringBootApplication注解源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
  • 从上面注解源码可以看出,@SpringBootApplication是一个复合注解
  • @Target @Retention @Documented @Inherited四个是元注解不用考虑
  • @SpringBootConfiguration 说明这个一个SpringBoot配置
  • @EnableAutoConfiguration 开启自动配置功能

@SpringBootConfiguration注解

  • @SpringBootConfiguration 源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
  • @Configuration 说明这个一个配置类(对应Spring的xml 配置文件)

@EnableAutoConfiguration注解

  • @EnableAutoConfiguration 注解源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
  • @AutoConfigurationPackage 自动配置包
  • @Import Spring底层注解 给容器中导入一个组件
@AutoConfigurationPackage注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
    • @Import Spring底层注解 给容器中导入一个组件

@Import 注解

  • AutoConfigurationImportSelector :自动配置导入选择器
  • AutoConfigurationPackages.Registrar.class: 将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器

AutoConfigurationImportSelector 类

  • getCandidateConfigurations() 方法
	protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   	List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
   			getBeanClassLoader());
   	Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
   			+ "are using a custom packaging, make sure that file is correct.");
   	return configurations;
   }
  • SpringFactoriesLoader类的 loadFactoryNames() 方法
   public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
       String factoryTypeName = factoryType.getName();
       return (List)loadSpringFactories(classLoader).getOrDefault(factoryTypeName, Collections.emptyList());
   }
  • loadSpringFactories() 方法
    loadSpringFactories

  • spring.factories 文件,自动配置都在springboot-autoconfigure的jar包中
    在这里插入图片描述

  • 看下自动配置类的代码
    在这里插入图片描述

  • 就是一个平常经常写的java配置类

自动配置原理

  1. SpringBoot在启动的会扫描classpath类路径下的META-INF/spring.factories
  2. 获取EnableAutoConfiguration指定的值,导入容器,进行自动配置工作
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值