深入浅析 -- SpringBoot自动配置原理


一、了解SpringBoot

SpringBoot基于Spring设计,不仅继承了Spring框架原有的优秀特性,而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。
SpringBoot所具备的特征有:

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
(2)内嵌Tomcat或Jetty等Servlet容器;
(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
(4)尽可能自动配置Spring容器;
(5)提供准备好的特性,如指标、健康检查和外部化配置;
(6)绝对没有代码生成,不需要XML配置。

二、Spring自动配置机制

代码如下(示例):

@SpringBootApplication
public class DemoApplication {
    
    
    public static void main(String[] args) {
    
    
        System.out.println("第一个SpringBoot框架!");
    }
}

官方虽然没有给出我们SpringBoot自动配置的源码,但是不难看出,SpringBoot是通过@SpringBootApplication来标识一个启动类,并完成相关依赖jar包的自动配置。
其中@SpringBootApplication是一个复合注解,由@SpringBootConfig、@EnableAutoConfigration、@ComponentScan组成。
SpringBoot主要是通过这仨个注解实现自动配置

在这里插入图片描述
我们点进去每个注解,看他们都做了什么。

@SpringBootConfiguration详解

代码如下(示例):

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration	
@Indexed
public @interface SpringBootConfiguration {
    
    
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

@SpringBootConfiguration底层是一个@Configuration注解,其作用是将类标记为一个配置类,并交给Spring容器管理。

@EnableAutoConfiguration详解

@EnableAutoConfiguration由两个注解组合而成:@AutoConfigurationPackage、@Import,其中@AutoConfiguration负责BeanDefinition的注册,@Import根据导入的AutoConfigurationImportSelector.class,去获取META-INFO下的Spring.factories配置文件,实现自动配置

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage	//负责实现Bean的定义与注册
@Import({
    
    AutoConfigurationImportSelector.class})	//负责自动配置
public @interface EnableAutoConfiguration {
    
    
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {
    
    };

    String[] excludeName() default {
    
    };
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

@AutoConfiguration中同样也是一个@Import注解,其中引入了Registrar.class,是实现BeanDefinition注册的关键类

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
    
    
        Registrar() {
    
    
        }
		//Bean注册核心类
        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
    
    
            AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
        }

        public Set<Object> determineImports(AnnotationMetadata metadata) {
    
    
            return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
        }
    }

在这里插入图片描述

@ComponentScan详解

扫描启动类同级包以及子级包里所有的Bean

在这里插入图片描述


三、总结

SpringBoot通过@SpringBootConfig、@EnableAutoConfigration、@ComponentScan三个注解实现自动配置。
(1)@ComponentScan负责项目项目启动类所有同级包和子级包所有的Bean
(2)那么不在项目内的Bean就需要@Import去实现,而Import的内容就是META-INFO中spring.factories中读取,并通过BeanDefinitionRegister实现Bean到Spring IOC的注册。实现Bean的装配

猜你喜欢

转载自blog.csdn.net/A_captain_608/article/details/127385694