欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot自动装配

程序员文章站 2024-02-15 11:56:46
...

自动装配原理

SpringBoot自动装配

注解:

  • @SpringBootApplication :这是springboot最核心的注解,当然也是组合注解

    • @SpringBootConfiguration 表明这是一个配置类
    • @ComponentScan 组件扫描
    • @EnableAutoConfiguration 是自动装配的总开关。
      • @AutoConfigurationPackage 配置自动扫描包的路径,与注解同级目录。
      • AutoConfigurationImportSelector类:根据配置文件(META-INF/spring.factories),将需要注入到容器的bean注入到容器,并根据META-INF/spring-autoconfigure-metadata.properties配置文件过滤。
  • SpringBootConfiguration:其实就是@Configuration注解,指明为配置类。

EnableAutoConfiguration:自动配置的注解。

//配置自动扫描包的路径,与注解同级目录。这也就是为什么启动类要放在所有包的同级目录的原因
@AutoConfigurationPackage

//注册AutoConfigurationImportSelector到Bean容器
@Import({AutoConfigurationImportSelector.class})

public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

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

    String[] excludeName() default {};
}
  • AutoConfigurationImportSelector类详解

这个类会去扫描SpringBoot中spring-boot-autoconfigure下的META-INF/spring.factories文件,该文件中保存了全部的配置类的路径!系统所有的自动配置的配置类名字都是xxxAutoConfiguration

SpringBoot自动装配

SpringBoot启动时会自动的去加载这些自动配置类,注入到Bean容器中。

随便打开一个自动配置类,如下

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({RabbitTemplate.class, Channel.class})
//上面两个注解先不关心

//加载配置,RabbitProperties中定义了一堆RabbitMQ相关的属性及get、set方法
@EnableConfigurationProperties({RabbitProperties.class})
//
@Import({RabbitAnnotationDrivenConfiguration.class})
public class RabbitAutoConfiguration {
    public RabbitAutoConfiguration() {
    }
    
}

如何自定义starter?

Springboot自带的starter一般以spring-boot-starter-XXX命名,我们自定义的starter以xxx-spring-boot-starter命名。

  • 创建一个xxx-spring-boot-starter工程来自定义一个starter。

  • 定义一个实体类来映射配置信息。

    一般以xxxProperties.java命名,里面包含一些配置信息属性,并在类上加上注解@ConfigurationProperties

    @ConfigurationProperties(prefix = "Xxx")
    public class XxxProperties {
    
    }
    
  • 定义一个配置类XxxAutoConfiguration,并加上@Configuration@EnableConfigurationProperties注解

    @Configuration
    @EnableConfigurationProperties({XxxProperties.class})
    public class XxxAutoConfiguration {
    
    }
    
  • 最后,在项目中resource目录下创建META-INF/spring.factories文件,在文件中指定自动装配的配置

    # Auto Configure
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.maolaoke.Xxx.autoconfigure.XxxAutoConfiguration
    

    最重要的就是这个文件,SpringBoot在启动时的自动装配会扫描这个文件,找到自动装配类注入到IOC容器。