springboot--自动装配

81 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

依赖

pom.xml

pom.xml的父类 spring-boot-starter-parent

启动器

spring-boot-starter-XXX:从dependencies中自动导入环境依赖

例如-web:自动导入web环境的所有依赖

点击去就能发现很多依赖包:spring-web,spring-webmvc,tomcat,json

<dependency>
<!--         启动器,web这个依赖包含了SpringMvc,自动装配,使用tomcat为默认容器-->
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>

spring-boot-starter-parent

资源过滤,maven插件

<resources>
    <resource>
      <filtering>true</filtering>
      <directory>${basedir}/src/main/resources</directory>
      <includes>
        <include>**/application*.yml</include>
        <include>**/application*.yaml</include>
        <include>**/application*.properties</include>
      </includes>
    </resource>
    <resource>
      <directory>${basedir}/src/main/resources</directory>
      <excludes>
        <exclude>**/application*.yml</exclude>
        <exclude>**/application*.yaml</exclude>
        <exclude>**/application*.properties</exclude>
      </excludes>
    </resource>
  </resources>

dependenices

所有功能场景变成启动器

spring-boot-dependencies 包下,已经指定好了那个版本,依赖时就不需要指定了

image.png

这些就是启动器

如果你想用哪个环境,就启用对应的启动器就行了

image.png

主程序

//这个类就是一个Component
@SpringBootApplication
//@SpringBootApplication标志这个类是一个springboot的应用
public class DemoApplication {
​
   public static void main(String[] args) {
       SpringApplication.run(DemoApplication.class, args);
  }
​
}

注解

@主配置类:springBootApplication:

作用:将该包及其所有子包纳入spring容器,这就是为什么要将业务放到主程序同级目录下的原因

//元注解,用来修饰当前注解,就像public类的修饰词,无实际功能
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// springboot的配置,说明这是一个配置文件类,它会被@ComponentScan扫描到
@SpringBootConfiguration
// 开启自动装配
@EnableAutoConfiguration
//扫描包(filters过滤一些东西)
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes =TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@SpringBootConfiguration:主程序为配置类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
// 配置类
@Configuration
public @interface SpringBootConfiguration {

@EnableAutoConfiguration

作用:自动注册包和引入需要的第三方jar包

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//获取所在包进行注册
@AutoConfigurationPackage
// 将第三方jar引入
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:所在包注册
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
// 对源数据所在包下组件进行注册
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
@AutoConfigurationPackages.Registrar

作用:打包源数据获取包名调用register注册

register方法: 注册包

static class Registrar implements ImportBeanDefinitionRegistrarDeterminableImports {
​
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistryregistry) {
           // new PackageImport(metadata).getPackageName())将源数据打包,并获得其包名
register(registry, new PackageImport(metadata).getPackageName());
}
​
@Override
public Set<ObjectdetermineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImport(metadata));
}
​
}

包名就是这个,主程序所在的包

image.png

@Import:三方jar包

List configurations = getCandidateConfigurations(annotationMetadata, attributes);

进入getCandidateConfigurations

getCandidateConfigurations:

protected List<StringgetCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   // 这边获取所有配置 getSpringFactoriesLoaderFactoryClass()方法就在下面
List<String> configurations =SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
   // 如果为空,输出语句,META-INF/spring.factories
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;
}
​
//   EnableAutoConfiguration返回的就是主程序的包,所以获取的是springboot的所有配置
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
​
loadFactoryNames

image.png

spring.factories

所在地址:

image.png

里面储存的都是配置类的路径,当你需要用时,就会通过路径调用配置类(比如视图解析器)