色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SpringBoot的核心注解1

jf_78858299 ? 來源:Java知音 ? 作者: 小毛毛 ? 2023-04-07 14:34 ? 次閱讀

今天跟大家來探討下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置

首先我們先來看段代碼

@SpringBootApplication
public class StartEurekaApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(StartEurekaApplication.class, args);
    }
}

我們點(diǎn)進(jìn)@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 {

}

上面的元注解我們?cè)谶@里不在做解釋,相信大家在開發(fā)當(dāng)中肯定知道,我們要來說@SpringBootConfiguration @EnableAutoConfiguration 這兩個(gè)注解,到這里我們知道 SpringBootApplication注解里除了元注解,我們可以看到又是@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan的組合注解,官網(wǎng)上也有詳細(xì)說明,那我們現(xiàn)在把目光投向這三個(gè)注解。

首先我們先來看 @SpringBootConfiguration,那我們點(diǎn)進(jìn)來看

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

}

我們可以看到這個(gè)注解除了元注解以外,就只有一個(gè)@Configuration,那也就是說這個(gè)注解相當(dāng)于@Configuration,所以這兩個(gè)注解作用是一樣的,那他是干嘛的呢,相信很多人都知道,它是讓我們能夠去注冊(cè)一些額外的Bean,并且導(dǎo)入一些額外的配置。那@Configuration還有一個(gè)作用就是把該類變成一個(gè)配置類,不需要額外的XML進(jìn)行配置。所以@SpringBootConfiguration就相當(dāng)于@Configuration。

那我們繼續(xù)來看下一個(gè)@EnableAutoConfiguration,這個(gè)注解官網(wǎng)說是 讓Spring自動(dòng)去進(jìn)行一些配置,那我們點(diǎn)進(jìn)來看

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

可以看到它是由 @AutoConfigurationPackage,@Import(EnableAutoConfigurationImportSelector.class)這兩個(gè)而組成的,我們先說@AutoConfigurationPackage,他是說:讓包中的類以及子包中的類能夠被自動(dòng)掃描到spring容器中。 我們來看@Import(EnableAutoConfigurationImportSelector.class)這個(gè)是核心,之前我們說自動(dòng)配置,那他到底幫我們配置了什么,怎么配置的?

就和@Import(EnableAutoConfigurationImportSelector.class)息息相關(guān),程序中默認(rèn)使用的類就自動(dòng)幫我們找到。我們來看EnableAutoConfigurationImportSelector.class

public class EnableAutoConfigurationImportSelector
      extends AutoConfigurationImportSelector {

   @Override
   protected boolean isEnabled(AnnotationMetadata metadata) {
      if (getClass().equals(EnableAutoConfigurationImportSelector.class)) {
         return getEnvironment().getProperty(
               EnableAutoConfiguration.ENABLED_OVERRIDE_PROPERTY, Boolean.class,
               true);
      }
      return true;
   }

}

可以看到他繼承了AutoConfigurationImportSelector我們繼續(xù)來看AutoConfigurationImportSelector,這個(gè)類有一個(gè)方法

public String[] selectImports(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return NO_IMPORTS;
   }
   try {
      AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
            .loadMetadata(this.beanClassLoader);
      AnnotationAttributes attributes = getAttributes(annotationMetadata);
      List

這個(gè)類會(huì)幫你掃描那些類自動(dòng)去添加到程序當(dāng)中。我們可以看到getCandidateConfigurations()這個(gè)方法,他的作用就是引入系統(tǒng)已經(jīng)加載好的一些類,到底是那些類呢,我們點(diǎn)進(jìn)去看一下

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

這個(gè)類回去尋找的一個(gè)目錄為META-INF/spring.factories,也就是說他幫你加載讓你去使用也就是在這個(gè)META-INF/spring.factories目錄裝配的,他在哪里?

圖片

我們點(diǎn)進(jìn)spring.factories來看

圖片

我們可以發(fā)現(xiàn)幫我們配置了很多類的全路徑,比如你想整合activemq,或者說Servlet

圖片

可以看到他都已經(jīng)幫我們引入了進(jìn)來,我看隨便拿幾個(gè)來看

org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.FallbackWebSecurityAutoConfiguration,\\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\\

比如我們經(jīng)常用的security,可以看到已經(jīng)幫你配置好,所以我們的EnableAutoConfiguration主要作用就是讓你自動(dòng)去配置,但并不是所有都是創(chuàng)建好的,是根據(jù)你程序去進(jìn)行決定。 那我們繼續(xù)來看

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, 
classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, 
classes = AutoConfigurationExcludeFilter.class) })

這個(gè)注解大家應(yīng)該都不陌生,掃描包,放入spring容器,那他在springboot當(dāng)中做了什么策略呢?我們可以點(diǎn)跟煙去思考,幫我們做了一個(gè)排除策略,他在這里結(jié)合SpringBootConfiguration去使用,為什么是排除,因?yàn)椴豢赡芤簧蟻砣考虞d,因?yàn)閮?nèi)存有限。

那么我們來總結(jié)下@SpringbootApplication:就是說,他已經(jīng)把很多東西準(zhǔn)備好,具體是否使用取決于我們的程序或者說配置,那我們到底用不用?那我們繼續(xù)來看一行代碼

public static void main(String[] args)
{
    SpringApplication.run(StartEurekaApplication.class, args);
}

那們來看下在執(zhí)行run方法到底有沒有用到哪些自動(dòng)配置的東西,比如說內(nèi)置的Tomcat,那我們來找找內(nèi)置Tomcat,我們點(diǎn)進(jìn)run

public static ConfigurableApplicationContext run(Object[] sources, String[] args) {
        return new SpringApplication(sources).run(args);
    }

然后他調(diào)用又一個(gè)run方法,我們點(diǎn)進(jìn)來看

public ConfigurableApplicationContext run(String... args) {
   //計(jì)時(shí)器
   StopWatch stopWatch = new StopWatch();
   stopWatch.start();
   ConfigurableApplicationContext context = null;
   FailureAnalyzers analyzers = null;
   configureHeadlessProperty();
   //監(jiān)聽器
   SpringApplicationRunListeners listeners = getRunListeners(args);
   listeners.starting();
   try {
      ApplicationArguments applicationArguments = new DefaultApplicationArguments(
            args);
      ConfigurableEnvironment environment = prepareEnvironment(listeners,
            applicationArguments);
      Banner printedBanner = printBanner(environment);
      //準(zhǔn)備上下文
      context = createApplicationContext();
      analyzers = new FailureAnalyzers(context);
         //預(yù)刷新context
      prepareContext(context, environment, listeners, applicationArguments,
            printedBanner);
     //刷新context
      refreshContext(context);
     //刷新之后的context
      afterRefresh(context, applicationArguments);
      listeners.finished(context, null);
      stopWatch.stop();
      if (this.logStartupInfo) {
         new StartupInfoLogger(this.mainApplicationClass)
               .logStarted(getApplicationLog(), stopWatch);
      }
      return context;
   }
   catch (Throwable ex) {
      handleRunFailure(context, listeners, analyzers, ex);
      throw new IllegalStateException(ex);
   }
}

那我們關(guān)注的就是 refreshContext(context); 刷新context,我們點(diǎn)進(jìn)來看

private void refreshContext(ConfigurableApplicationContext context) {
   refresh(context);
   if (this.registerShutdownHook) {
      try {
         context.registerShutdownHook();
      }
      catch (AccessControlException ex) {
         // Not allowed in some environments.
      }
   }
}

我們繼續(xù)點(diǎn)進(jìn)refresh(context);

protected void refresh(ApplicationContext applicationContext) {
   Assert.isInstanceOf(AbstractApplicationContext.class, applicationContext);
   ((AbstractApplicationContext) applicationContext).refresh();
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    33078
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14338
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    149

    瀏覽量

    35823
  • 注解
    +關(guān)注

    關(guān)注

    0

    文章

    18

    瀏覽量

    2672
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    177
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    怎樣去使用springboot

    怎樣去使用springboot呢?學(xué)習(xí)springboot需要懂得哪些?
    發(fā)表于 10-25 07:13

    Spring Boot的注解原理是什么

    首先,先看SpringBoot的主配置類: @SpringBootApplicationpublic class StartEurekaApplication { public static
    的頭像 發(fā)表于 08-27 09:24 ?2192次閱讀

    Spring Boot中常見的各類型注解的使用方式

    大家好,我是程序汪,企業(yè)開發(fā)項(xiàng)目SpringBoot已經(jīng)是必備框架了,其中注解是開發(fā)中的小工具(誰處可見哦),用好了開發(fā)效率大大提升,當(dāng)然用錯(cuò)了也會(huì)引入缺陷。
    的頭像 發(fā)表于 06-20 16:38 ?1815次閱讀

    Spring Boot常用注解與使用方式

    企業(yè)開發(fā)項(xiàng)目SpringBoot已經(jīng)是必備框架了,其中注解是開發(fā)中的小工具(誰處可見哦),用好了開發(fā)效率大大提升,當(dāng)然用錯(cuò)了也會(huì)引入缺陷。
    的頭像 發(fā)表于 07-08 10:57 ?1364次閱讀

    求一種SpringBoot定時(shí)任務(wù)動(dòng)態(tài)管理通用解決方案

    SpringBoot的定時(shí)任務(wù)的加強(qiáng)工具,實(shí)現(xiàn)對(duì)SpringBoot原生的定時(shí)任務(wù)進(jìn)行動(dòng)態(tài)管理,完全兼容原生@Scheduled注解,無需對(duì)原本的定時(shí)任務(wù)進(jìn)行修改
    的頭像 發(fā)表于 02-03 09:49 ?774次閱讀

    Java注解及其底層原理解析 1

    什么是注解? 當(dāng)我們開發(fā)SpringBoot項(xiàng)目,我們只需對(duì)啟動(dòng)類加上`@SpringBootApplication`,就能自動(dòng)裝配,不需要編寫冗余的xml配置。當(dāng)我們?yōu)轫?xiàng)目添加lombok
    的頭像 發(fā)表于 02-09 14:18 ?757次閱讀
    Java<b class='flag-5'>注解</b>及其底層原理解析 <b class='flag-5'>1</b>

    什么是 SpringBoot

    本文從為什么要有 `SpringBoot`,以及 `SpringBoot` 到底方便在哪里開始入手,逐步分析了 `SpringBoot` 自動(dòng)裝配的原理,最后手寫了一個(gè)簡(jiǎn)單的 `start` 組件,通過實(shí)戰(zhàn)來體會(huì)了 `
    的頭像 發(fā)表于 04-07 11:28 ?1306次閱讀
    什么是 <b class='flag-5'>SpringBoot</b>?

    SpringBoot常用注解及使用方法1

    基于 SpringBoot 平臺(tái)開發(fā)的項(xiàng)目數(shù)不勝數(shù),與常規(guī)的基于`Spring`開發(fā)的項(xiàng)目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開發(fā),而且非常簡(jiǎn)單,基本可以做到開箱即用! 那
    的頭像 發(fā)表于 04-07 11:51 ?698次閱讀

    SpringBoot常用注解及使用方法2

    基于 SpringBoot 平臺(tái)開發(fā)的項(xiàng)目數(shù)不勝數(shù),與常規(guī)的基于Spring開發(fā)的項(xiàng)目最大的不同之處,SpringBoot 里面提供了大量的注解用于快速開發(fā),而且非常簡(jiǎn)單,基本可以做到開箱即用!
    的頭像 發(fā)表于 04-07 11:52 ?675次閱讀

    Springboot常用注解合集

    前幾章,在系統(tǒng)啟動(dòng)類里面,都加入了此啟動(dòng)注解,此注解是個(gè)組合注解,包括了`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@ComponentScan`
    的頭像 發(fā)表于 04-07 14:27 ?731次閱讀
    <b class='flag-5'>Springboot</b>常用<b class='flag-5'>注解</b>合集

    SpringBoot常用注解及原理

    SpringBootConfiguration繼承自@Configuration,二者功能也一致,標(biāo)注當(dāng)前類是配置類, 并會(huì)將當(dāng)前類內(nèi)聲明的一個(gè)或多個(gè)以@Bean注解標(biāo)記的方法的實(shí)例納入到spring容器中,并且實(shí)例名就是方法名。
    的頭像 發(fā)表于 04-07 14:30 ?582次閱讀

    SpringBoot核心注解2

    今天跟大家來探討下SpringBoot核心注解@SpringBootApplication以及run方法,理解下springBoot為什么不需要XML,達(dá)到零配置
    的頭像 發(fā)表于 04-07 14:34 ?1958次閱讀
    <b class='flag-5'>SpringBoot</b>的<b class='flag-5'>核心</b><b class='flag-5'>注解</b>2

    springboot核心注解

    Spring Boot 是基于 Spring 框架的開源框架,它可以幫助開發(fā)者快速構(gòu)建、部署和運(yùn)行獨(dú)立的、生產(chǎn)級(jí)的 Spring 應(yīng)用程序。Spring Boot 提供了一系列核心注解,這些注解可以
    的頭像 發(fā)表于 11-23 09:23 ?513次閱讀

    一個(gè)注解搞定SpringBoot接口防刷

    技術(shù)要點(diǎn):springboot的基本知識(shí),redis基本操作,
    的頭像 發(fā)表于 11-28 10:46 ?402次閱讀

    SpringBoot核心注解由幾個(gè)注解組成

    簡(jiǎn)化應(yīng)用程序開發(fā)的注解,其中核心注解包括 @SpringBootApplication、@RestController、@RequestMapping、@Autowired、@ComponentScan
    的頭像 發(fā)表于 12-03 15:09 ?755次閱讀
    主站蜘蛛池模板: 亚洲精品无码久久久久A片 | 国产一卡2卡3卡4卡孕妇网站| 欧美日韩高清一区| 伊人久久综合谁合综合久久| 国产精品野外AV久久久| 日韩免费精品视频| qvod播放电影| 男人J放进女人屁股免费观看| 中文国产成人精品久久免费| 九色终合九色综合88| 亚洲精品国产第一区第二区| 国产精品人妻午夜福利 | 永久免费无码AV国产网站| 国产亚洲色婷婷久久精品99| 天天看学生视频| 国产高清视频免费最新在线| 色欲无码国产喷水AV精品| 超碰公开在线caopon| 日本吃孕妇奶水免费观看| xlxx美女| 日日日夜夜在线视频| 纯肉合集(高H)| 视频网站入口在线看| 国产成人免费在线| 无码国产伦一区二区三区视频 | 狂操空姐电影| 中文字幕在线视频网站| 毛片在线网址| aaaaaa级特色特黄的毛片| 欧美一级情欲片在线| 草比比过程图| 使劲别停好大好深好爽动态图| 国产69精品久久久久无码麻豆 | 久久综合色悠悠| 中文字幕乱偷无码AV蜜桃| 美女张开腿露尿口给男人亲| 97久久无码精品AV| 秋霞午夜理论理论福利无码| 大胸美女被吊起来解开胸罩 | 18禁无遮遮挡羞漫画免费阅读| 邻家美姨在线观看全集免费|