天天看點

SpringBoot核心注解SpringBoot核心注解

SpringBoot核心注解

SpringBoot項目通常有一個*Application的入口類,這個類裡面有main方法即項目的主方法,啟動項目,在入口類上有一個注解 @SpringBootAppliaction 此注解就是SpringBoot項目的核心注解。通過學習此注解可以了解SpringBoot項目運作的基本原理。

注解@SpringBootApplication是SpringBoot的核心注解,也是一個組合注解,如下:

@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 {
           

先了解兩個概念:組合注解和元注解

組合注解:被注解的注解,即有多個注解組合成的注解,此注解就具備了組合它的注解的功能

元注解:可以注解到别的注解上的注解,即用于修飾注解的注解

我們可以看到@SpringBootApplication注解是由多個注解組合而成,其中@Target、@Retention、@Document、@Inherited為元注解。java5.0定義了4個标準的meta-annotation類型,它們被用來提供對其它annotation類型作說明。

可以簡單了解一下這四個元注解

@Target

用于描述注解的範圍,即注解在哪用。它說明了Annotation所修飾的對象範圍:Annotation可被用于 packages、types(類、接口、枚舉、Annotation類型)、類型成員(方法、構造方法、成員變量、枚舉值)、方法參數和本地變量(如循環變量、catch參數)等。取值類型(ElementType)有以下幾種:

  CONSTRUCTOR:用于描述構造器
  FIELD:用于描述域即類成員變量
  LOCAL_VARIABLE:用于描述局部變量
  METHOD:用于描述方法
  PACKAGE:用于描述包
  PARAMETER:用于描述參數
  TYPE:用于描述類、接口(包括注解類型) 或enum聲明
  TYPE_PARAMETER:1.8版本開始,描述類、接口或enum參數的聲明
  TYPE_USE:1.8版本開始,描述一種類、接口或enum的使用聲明
           

@Retention

用于描述注解的生命周期,表示需要在什麼級别儲存該注解,即保留的時間長短。取值類型(RetentionPolicy)有以下幾種:

  SOURCE:在源檔案中有效(即源檔案保留)
  CLASS:在class檔案中有效(即class保留)
  RUNTIME:在運作時有效(即運作時保留)
           

@Document

用于描述其它類型的annotation應該被作為被标注的程式成員的公共API,是以可以被例如javadoc此類的工具文檔化。它是一個标記注解,沒有成員。

@Inherited

用于表示某個被标注的類型是被繼承的。如果一個使用了@Inherited修飾的annotation類型被用于一個class,則這個annotation将被用于該class的子類。

我們可以發現@SpringBootApplication注解除了四個元注解外還有@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan注解

首先 @SpringBootConfiguration 注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}
           

除了元注解外剩餘@Configuration,此注解我們相對比較熟悉,@Configuration注解用在某個類上表示這個類是配置類,項目啟動時就加載,并且将此類注入到Spring容器中,是以我們也就會想到入口類*Application其實也是一個配置類,項目啟動裝配。

接下來 @EnableAutoConfiguration 注解

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

@EnableAutoConfiguration注解開啟自動配置,是@SpringBootApplication的核心功能。

@AutoConfigurationPackage是項目中所有的包注冊。

而@EnableAutoConfiguration最重要的是引入AutoConfigurationImportSelector将所有符合條件的@Configuration配置加載到IOC容器中,借助Spring的工具類SpringFactoriesLoader掃描具有META-INF/spring.factories檔案的jar包,并将其注入

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;
	}
           

例如spring-boot-autoconfigure-2.1.8RELEASE.jar其中包含META-INF/spring.factories檔案,在此jar包中就包含着我們常用到的SpringBoot已經內建的元件。比如:aop、jdbc、cache、web、thymeleaf等等,是以我們在使用SpringBoot特别友善,SpringBoot已經幫我們內建了跟多需要的元件。有興趣可以看一下這個jar包。

最後 @ComponentScan 注解

@ComponentScan也是熟悉的注解,Spring通過@ComponentScan注解啟動掃描,@ComponentScan有一個屬性basePackages可以設定要掃描的基礎包,注意基礎包路徑為全路徑,當然可能你注意到了basePackages是一個複數,是以可以配置多個基礎包,若隻配置一個基礎包,可以省略basePackages;若不配置基礎包,那麼掃描的是配置類目前的包以及其子包。是以SpringBoot入口類與基本包同一級,是以@ComponentScan可以掃描到項目中所有的包,并且将添加了@Component注解的類注入到IOC容器中,類似Spring架構中如下操作:

@Configuration
@ComponentScan( "com.cxd.javaweb.service")
public class ComponentConfig {
}
           

繼續閱讀