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里面的内容的差距就是很大的。
@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对象。