SpringBoot的自动配置、起步依赖、核心注解

SpringBoot有三大核心的功能:
    一、自动装配原理
    二、起步依赖
    三、核心注解


一、自动配置原理

SpringBoot框架是一个服务于框架的框架,他极大的简化了框架的配置,使得开发者能更加专注的开发程序。在Spring框架中,添加一个功能通过是要配置很多配置文件的,配置文件的设置是非常繁琐的而SpringBoot就很好,这也就是自动装配给我们带来了极大的简化。

在SpringBoot项目中,就算不编写application.yml配置文件都是可以启动项目的,这时候这个项目的所有的设置都是默认的,也就是说SpringBoot框架帮我们封装了很多的配置。

在启动SpringBoot项目中,只需要在启动类上添加一个@SpringBootApplication注解即可。所以,研究吧!

@SpringBootApplication
@MapperScan("com.hui.mapper")
public class ApplicationStart {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationStart.class, args);
    }
}
点击@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 {

在这里会发现,关于自动配置的注解,主要是@EnableAutoConfiguration这个注解。这个注解的目的就是,他是会开启SpringBoot的自动配置的注解的开关。

继续点击它,进入源码分析:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {

会发现在这里面主要有两个注解:

  • @Import({AutoConfigurationImportSelector.class})这个注解,它是一个导入的注解,会导入一个类信息,这个类点进去,分析源码:

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;
	}
这个类里面有一个方法,在这个方法里面会执行一个方法,就是SpringFactoryLoader.loadFactoryNames()方法,这个方法的主要作用就是会在org.springframworker包下有一个auto-configuration包下有一个spring.factories文件,这个文件里面就有很多的配置类信息,什么什么configuration等等,这个就是SpringBoot框架自己配置的一些默认的需要的一些配置,这个文件会根据spring-boot-starter-parent的版本不同,里面的内容也是不同的,2.1.1里面的内容与2.6.6里面的内容的差距就是很大的。
 
   @AutoConfigurationPackage这个注解的作用主要是进行扫描配置包的扫描,分析源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
}
发现里面有一个注解很重要,就是@Import(AutoConfigurationPackages.Registrar.class)

总的来说,在SpringBoot项目中对于配置的信息SpringBoot会有默认的设置(spring.factories)

二、起步依赖原理

我认为,起步依赖的本质其实就是依赖的传递。因为在SpringBoot项目中引入坐标的方式和Spring框架中引入坐标的方式是不一样的。在Spring框架中,他是一个根据功能去添加坐标的,但是在SpringBoot框架中,他是根据一类的功能模块实现添加依赖的,就比如,在Spring框架中,添加web相关的依赖,就需要添加很多:spring-core、spring-web、spring-webmvc等等,但是在SpringBoot蒸南瓜我只需要添加spring-boot-starter-web即可,它包含了一系列的坐标,并且已经做好了版本的适配,就很好很方便,没有Spring框架那么容易出现版本冲突的问题。

    在SpringBoot项目中,是需要依赖一个spring-boot-starter-parent依赖的,源码:

        <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
    </parent>
点进去分析源码:
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.6.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
  </parent>
会发现他还有一个父依赖spring-boot-dependencies:
<properties>
    <activemq.version>5.15.12</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.79</appengine-sdk.version>
    <artemis.version>2.10.1</artemis.version>
    <aspectj.version>1.9.5</aspectj.version>
    <assertj.version>3.13.2</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
    <awaitility.version>4.0.2</awaitility.version>
    <bitronix.version>2.1.4</bitronix.version>
    <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
    <byte-buddy.version>1.10.8</byte-buddy.version>
    <caffeine.version>2.8.1</caffeine.version>
    <cassandra-driver.version>3.7.2</cassandra-driver.version>
    <classmate.version>1.5.1</classmate.version>
    <commons-codec.version>1.13</commons-codec.version>
    <commons-dbcp2.version>2.7.0</commons-dbcp2.version>
    <commons-lang3.version>3.9</commons-lang3.version>
    <commons-pool.version>1.6</commons-pool.version>
    <commons-pool2.version>2.7.0</commons-pool2.version>
    <couchbase-cache-client.version>2.1.0</couchbase-cache-client.version>
    <couchbase-client.version>2.7.13</couchbase-client.version>
    <db2-jdbc.version>11.5.0.0</db2-jdbc.version>
    <dependency-management-plugin.version>1.0.9.RELEASE</dependency-management-plugin.version>
    <derby.version>10.14.2.0</derby.version>
    <dropwizard-metrics.version>4.1.5</dropwizard-metrics.version>
    <ehcache.version>2.10.6</ehcache.version>
    <ehcache3.version>3.8.1</ehcache3.version>
    <elasticsearch.version>6.8.7</elasticsearch.version>
    <embedded-mongo.version>2.2.0</embedded-mongo.version>
    <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version>
    <flatten-maven-plugin.version>1.1.0</flatten-maven-plugin.version>
    <flyway.version>6.0.8</flyway.version>
    <freemarker.version>2.3.30</freemarker.version>
    <git-commit-id-plugin.version>3.0.1</git-commit-id-plugin.version>
    <glassfish-el.version>3.0.3</glassfish-el.version>
    <glassfish-jaxb.version>2.3.2</glassfish-jaxb.version>
    ...............................................................................

会发现里面有很多的依赖,有很长常见的一些数据源配置、注解配置、JSON配置等等。

所以会发现,其实我们虽然只是依赖了一个spring-boot-starter-parent,但是背后其实已经有很多的默认依赖了,都是传递给我们了。所以说,起步依赖的本质,就是依赖的传递

三、核心注解

在SpringBoot项目中是由很多的核心注解的,就是这些注解,极大程度上帮助我们简化的项目的启动和配置。

  • @SpringBootApplication

    这个注解是在项目的启动类上使用的,位置在启动类的上方。

  • @SpringBootConfiguration

    这个注解是配置类注解,是在类上使用的,表明该类是一个配置类,在项目启动的时候,会进行加载到容器中使用,同时@SpringBootConfiguration和@Configuration的功能是一样的,不同的是,一个是SpringBoot的注解一个是Spring的注解。

  • @EnableAutoConfiguration

    这个注解的主要作用是开启自动配置的开关

  • @Import({AutoConfigurationImportSelector.class})

    这个注解是会导入一个配置类,这个配置类会执行一个方法SpringFactoryLoader.loadFactoryNames()这个方法的作用就是会在autoconfiguration包下的MEAT-INF包下会加载一个spring.factories文件,进行默认的配置加载。

  • @AutoConfigurationPackage

    这个注解是一个自动扫描的注解,他会自动扫描主类包下所有家里注解的包,比如加了@Controller、@Service等的包。

  • @ComponentScan

    这个注解,会扫描项目,绕然后自动装配一些项目需要的Bean对象。

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务