欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

springboot中怎么配置AutoConfiguration

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)springboot中怎么配置AutoConfiguration,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)是專業(yè)的臨城網(wǎng)站建設(shè)公司,臨城接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行臨城網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

1.如何開啟自動配置

在啟動類上增加注解@EnableAutoConfiguration或者@SpringBootApplication,注意:如果使用@SpringBootApplication同時會默認(rèn)開啟@ComponentScan。

2.@EnableAutoConfiguration注解

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

   String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";   /**    * Exclude specific auto-configuration classes such that they will never be applied.    * @return the classes to exclude    */   Class<?>[] exclude() default {};   /**    * Exclude specific auto-configuration class names such that they will never be    * applied.    * @return the class names to exclude    * @since 1.3.0    */   String[] excludeName() default {};}

從源碼上看,@EnableAutoConfiguration 引入了 1)@AutoConfigurationPackage注解 2)AutoConfigurationImportSelector.class 

我們先看看AutoConfigurationImportSelector.class類的實現(xiàn),@AutoConfigurationPackage注解稍后再解讀。

3.AutoConfigurationImportSelector.class類實現(xiàn)

AutoConfigurationImportSelector是繼承的DeferredImportSelector,并且使用@Import注解導(dǎo)入的(具體可以查看springboot之@Import注解)。所以,我們主要看 selectImports 方法的實現(xiàn)。

@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {   if (!isEnabled(annotationMetadata)) {  //判斷是否開啟自動配置,默認(rèn)開啟,可以使用spring.boot.enableautoconfiguration=false關(guān)閉自動配置  return NO_IMPORTS;   }
   AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);   return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}

從源碼可以看出,先檢查了一下是否開啟自動配置,然后獲取所有自動配置的類路徑,并返回。進(jìn)一步查看getAutoConfigurationEntry方法。

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {   if (!isEnabled(annotationMetadata)) { //1)再次判斷是否開啟自動配置  return EMPTY_ENTRY;   }
   AnnotationAttributes attributes = getAttributes(annotationMetadata); //2)獲取注解信息   List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); //3)獲取所有自動配置的類   configurations = removeDuplicates(configurations); 
   Set<String> exclusions = getExclusions(annotationMetadata, attributes); //4)獲取需要排除掉的自動配置類   checkExcludedClasses(configurations, exclusions); //5)校驗需要排除的類是否存在,如果不存在,拋出異常   configurations.removeAll(exclusions); //6)過濾掉需要排除的類   configurations = getConfigurationClassFilter().filter(configurations); //7)通過配置的filter過濾掉需要排除的類   fireAutoConfigurationImportEvents(configurations, exclusions); //8) 通知自動配置listener,AutoConfigurationImportListener
   return new AutoConfigurationEntry(configurations, exclusions); //9)返回最終需要自動配置的類}

主要看一下getCandidateConfigurations方法實現(xiàn):

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),         getBeanClassLoader()); //使用spring通用工廠加載   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;}

最終返回給DeferredImportSelector的自動配置類列表,是通過SpringFactoriesLoader通用工廠加載的,SpringFactoriesLoader會掃描classpath下的所有 META-INF/spring.factories 文件,并通過key-value鍵值對的方式獲取配置。而我們autoconfig功能使用的key=org.springframework.boot.autoconfigure.EnableAutoConfiguration。如下圖:

springboot中怎么配置AutoConfiguration

所以,如果我們自己需要實現(xiàn)autoconfig,只需要在classpath路徑下新建一個文件META-INF/spring.factories,并加上org.springframework.boot.autoconfigure.EnableAutoConfiguration=實現(xiàn)類,即可。

4.@AutoConfigurationPackage注解

現(xiàn)在,回過頭來,我們看下@EnableAutoConfiguration上的@AutoConfigurationPackage注解的作用。

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@Import(AutoConfigurationPackages.Registrar.class)public @interface AutoConfigurationPackage {   String[] basePackages() default {};   Class<?>[] basePackageClasses() default {};}

查看源碼可以看到,@AutoConfigurationPackage注解上import了AutoConfigurationPackages.Registrar.class。

5.AutoConfigurationPackages.Registrar.class類實現(xiàn)

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {   @Override   public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {      register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0])); // 1)初始化 PackageImports  2)注冊bean   }   @Override   public Set<Object> determineImports(AnnotationMetadata metadata) {      return Collections.singleton(new PackageImports(metadata));   }

}

源碼可以看出,實現(xiàn)了ImportBeanDefinitionRegistrar,并注冊了一個PackageImports。

1)初始化PackageImports

PackageImports(AnnotationMetadata metadata) {
   AnnotationAttributes attributes = AnnotationAttributes
         .fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false)); // 獲取注解屬性   List<String> packageNames = new ArrayList<>();   for (String basePackage : attributes.getStringArray("basePackages")) {  
      packageNames.add(basePackage);  // basePackages屬性不為空時,設(shè)置配置的包路徑   }   for (Class<?> basePackageClass : attributes.getClassArray("basePackageClasses")) {
      packageNames.add(basePackageClass.getPackage().getName()); // basePackageClasses屬性不為空時,設(shè)置該類的包路徑   }   if (packageNames.isEmpty()) {
      packageNames.add(ClassUtils.getPackageName(metadata.getClassName())); // 默認(rèn)設(shè)置啟動類的包路徑   }   this.packageNames = Collections.unmodifiableList(packageNames);}

從源碼可以看出,在初始化PackageImports時,默認(rèn)會設(shè)置啟動類路徑。

2)注冊PackageImports

我們繼續(xù)看下regsiter注冊的方法。

public static void register(BeanDefinitionRegistry registry, String... packageNames) {   if (registry.containsBeanDefinition(BEAN)) {  
      BeanDefinition beanDefinition = registry.getBeanDefinition(BEAN);      ConstructorArgumentValues constructorArguments = beanDefinition.getConstructorArgumentValues();      constructorArguments.addIndexedArgumentValue(0, addBasePackages(constructorArguments, packageNames));   }   else {
      GenericBeanDefinition beanDefinition = new GenericBeanDefinition();      beanDefinition.setBeanClass(BasePackages.class);      beanDefinition.getConstructorArgumentValues().addIndexedArgumentValue(0, packageNames);      beanDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);      registry.registerBeanDefinition(BEAN, beanDefinition);   }
}

入?yún)ackageNames是剛剛創(chuàng)建的PackageImports對象里面設(shè)置的包路徑,regsiter方法主要內(nèi)容是,將獲取到的包路徑,初始化為BasePackages.class類的對象,并注冊到容器中。

那么問題來了,BasePackages注冊到容器中之后,到底有什么用呢?

3)使用場景

查看AutoConfigurationPackages類源碼,能發(fā)現(xiàn)以下方法:

public static List<String> get(BeanFactory beanFactory) {   try {      return beanFactory.getBean(BEAN, BasePackages.class).get();   }   catch (NoSuchBeanDefinitionException ex) {      throw new IllegalStateException("Unable to retrieve @EnableAutoConfiguration base packages");   }
}

這個靜態(tài)方法就是獲取剛剛注冊的BasePackages對象,里面保存了獲取到的類路徑。

根據(jù)方法引用可以看出,在MybatisAutoConfiguration、Neo4jDataAutoConfiguration、CassandraDataAutoConfiguration等自動配置類有使用。

查看具體源碼可以看出,使用場景為:當(dāng)某些組件需要自動掃描時,可以使用該包路徑為掃描的根路徑。MybatisAutoConfiguration示例如下:

springboot中怎么配置AutoConfiguration

6.總結(jié)

1)AutoConfig功能是通過SpringFactoriesLoader通用工廠加載實現(xiàn)的,配置文件為META-INF/spring.factories

2)@AutoConfigurationPackage注解是向容器中注冊需要掃描的根目錄信息(默認(rèn)啟動類包路徑,可配置),當(dāng)某些組件需要自動掃描時,可以使用該包路徑為掃描的根路徑。

上述就是小編為大家分享的springboot中怎么配置AutoConfiguration了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)站標(biāo)題:springboot中怎么配置AutoConfiguration
網(wǎng)頁路徑:http://aaarwkj.com/article36/iipipg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、品牌網(wǎng)站制作靜態(tài)網(wǎng)站、外貿(mào)建站做網(wǎng)站、定制開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

微信小程序開發(fā)
欧美护士激情第一欧美精品| 最近av中文字幕电影| 久久九特黄的免费大片| 高清美女视频亚洲免费| 精品成人乱色一区二区| 国产91精品成人在线观看| 国产999精品在线观看| 91亚洲自偷观看高清| 黄色录像一级二级三级| 字幕日本欧美一区二区| 久久好大好爽要死了欧美| 亚洲成人自拍在线视频| 国产精品一区二区激情视频| 国内精品久久大型新型| 欧美精品一区二区亚洲| 国产黄片a三级久久久久久| 国产精品熟女一区二区三区| 亚洲欧美成人免费视频| 国产色视频一区在线观看| 人妻有码中文字幕在线| 中文字幕av二区三区人妻| 中文字幕成人在线电影| 亚洲欧美日韩国产一区二区三区| 亚洲av男人天堂一区| 粗长挺进新婚人妻诗岚| 精品一区二区三区高清| 日本中文字幕区二区三区电影 | 日韩黄片大全在线观看| 国产一区二区三区精品久| 欧美亚洲国产日韩在线高清| 日韩黄色一级免费在线观看| 欧美亚洲另类日韩综合网| 快播av手机在线播放| 亚洲人成伊人久久成| 欧美日韩黄色的三级视频| 亚洲欧美av中文日韩二区| 亚洲乱码在线中文字幕| av岛国不卡一区二区在线观看| 国产免费一级av剧情| 精品一区二区久久久久久网精 | 国产一区欧美二区日韩三区|