在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

SpringBoot的核心注解2

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

他會調(diào)用 ((AbstractApplicationContext) applicationContext).refresh();方法,我們點進來看

public void refresh() throws BeansException, IllegalStateException {
   synchronized (this.startupShutdownMonitor) {
      // Prepare this context for refreshing.
      prepareRefresh();

      // Tell the subclass to refresh the internal bean factory.
      ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

      // Prepare the bean factory for use in this context.
      prepareBeanFactory(beanFactory);

      try {
         // Allows post-processing of the bean factory in context subclasses.
         postProcessBeanFactory(beanFactory);

         // Invoke factory processors registered as beans in the context.
         invokeBeanFactoryPostProcessors(beanFactory);

         // Register bean processors that intercept bean creation.
         registerBeanPostProcessors(beanFactory);

         // Initialize message source for this context.
         initMessageSource();

         // Initialize event multicaster for this context.
         initApplicationEventMulticaster();

         // Initialize other special beans in specific context subclasses.
         onRefresh();

         // Check for listener beans and register them.
         registerListeners();

         // Instantiate all remaining (non-lazy-init) singletons.
         finishBeanFactoryInitialization(beanFactory);

         // Last step: publish corresponding event.
         finishRefresh();
      }

      catch (BeansException ex) {
         if (logger.isWarnEnabled()) {
            logger.warn("Exception encountered during context initialization - " +
                  "cancelling refresh attempt: " + ex);
         }

         // Destroy already created singletons to avoid dangling resources.
         destroyBeans();

         // Reset 'active' flag.
         cancelRefresh(ex);

         // Propagate exception to caller.
         throw ex;
      }

      finally {
         // Reset common introspection caches in Spring's core, since we
         // might not ever need metadata for singleton beans anymore...
         resetCommonCaches();
      }
   }
}

這點代碼似曾相識啊 沒錯,就是一個spring的bean的加載過程我在,解析springIOC加載過程的時候介紹過這里面的方法,如果你看過Spring源碼的話 ,應該知道這些方法都是做什么的。現(xiàn)在我們不關(guān)心其他的,我們來看一個方法叫做 onRefresh();方法

protected void onRefresh() throws BeansException {
   // For subclasses: do nothing by default.
}

他在這里并沒有實現(xiàn),但是我們找他的其他實現(xiàn),我們來找

圖片

我們既然要找Tomcat那就肯定跟web有關(guān),我們可以看到有個ServletWebServerApplicationContext

@Override
protected void onRefresh() {
   super.onRefresh();
   try {
      createWebServer();
   }
   catch (Throwable ex) {
      throw new ApplicationContextException("Unable to start web server", ex);
   }
}

我們可以看到有一個createWebServer();方法他是創(chuàng)建web容器的,而Tomcat不就是web容器,那他是怎么創(chuàng)建的呢,我們繼續(xù)看

private void createWebServer() {
   WebServer webServer = this.webServer;
   ServletContext servletContext = getServletContext();
   if (webServer == null && servletContext == null) {
      ServletWebServerFactory factory = getWebServerFactory();
      this.webServer = factory.getWebServer(getSelfInitializer());
   }
   else if (servletContext != null) {
      try {
         getSelfInitializer().onStartup(servletContext);
      }
      catch (ServletException ex) {
         throw new ApplicationContextException("Cannot initialize servlet context",
               ex);
      }
   }
   initPropertySources();
}

factory.getWebServer(getSelfInitializer());他是通過工廠的方式創(chuàng)建的

public interface ServletWebServerFactory {

   WebServer getWebServer(ServletContextInitializer... initializers);

}

可以看到 它是一個接口,為什么會是接口。因為我們不止是Tomcat一種web容器。

圖片

我們看到還有Jetty,那我們來看TomcatServletWebServerFactory

@Override
public WebServer getWebServer(ServletContextInitializer... initializers) {
   Tomcat tomcat = new Tomcat();
   File baseDir = (this.baseDirectory != null) ? this.baseDirectory
         : createTempDir("tomcat");
   tomcat.setBaseDir(baseDir.getAbsolutePath());
   Connector connector = new Connector(this.protocol);
   tomcat.getService().addConnector(connector);
   customizeConnector(connector);
   tomcat.setConnector(connector);
   tomcat.getHost().setAutoDeploy(false);
   configureEngine(tomcat.getEngine());
   for (Connector additionalConnector : this.additionalTomcatConnectors) {
      tomcat.getService().addConnector(additionalConnector);
   }
   prepareContext(tomcat.getHost(), initializers);
   return getTomcatWebServer(tomcat);
}

那這塊代碼,就是我們要尋找的內(nèi)置Tomcat,在這個過程當中,我們可以看到創(chuàng)建Tomcat的一個流程。因為run方法里面加載的東西很多,所以今天就淺談到這里。如果不明白的話, 我們在用另一種方式來理解下,

大家要應該都知道stater舉點例子

<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-data-redis<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>
<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-freemarker<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>

所以我們不防不定義一個stater來理解下,我們做一個需求,就是定制化不同的人跟大家說你們好,我們來看

<parent>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-parent<span class="hljs-name"artifactId>
    <version>2.1.4.RELEASE<span class="hljs-name"version>
    <relativePath/>
<span class="hljs-name"parent>
<groupId>com.zgw<span class="hljs-name"groupId>
<artifactId>gw-spring-boot-srater<span class="hljs-name"artifactId>
<version>1.0-SNAPSHOT<span class="hljs-name"version>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot<span class="hljs-name"groupId>
        <artifactId>spring-boot-autoconfigure<span class="hljs-name"artifactId>
    <span class="hljs-name"dependency>
<span class="hljs-name"dependencies>

我們先來看maven配置寫入版本號,如果自定義一個stater的話必須依賴spring-boot-autoconfigure這個包,我們先看下項目目錄

圖片

public class GwServiceImpl  implements GwService{
    @Autowired
    GwProperties properties;

    @Override
    public void Hello()
    {
        String name=properties.getName();
        System.out.println(name+"說:你們好啊");
    }
}

我們做的就是通過配置文件來定制name這個是具體實現(xiàn)

@Component
@ConfigurationProperties(prefix = "spring.gwname")
public class GwProperties {

    String name="zgw";

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

這個類可以通過@ConfigurationProperties讀取配置文件

@Configuration
@ConditionalOnClass(GwService.class)  //掃描類
@EnableConfigurationProperties(GwProperties.class) //讓配置類生效
public class GwAutoConfiguration {

    /**
    * 功能描述 托管給spring
    * @author zgw
    * @return
    */
    @Bean
    @ConditionalOnMissingBean
    public GwService gwService()
    {
        return new GwServiceImpl();
    }
}

這個為配置類,為什么這么寫因為,spring-boot的stater都是這么寫的,我們可以參照他仿寫stater,以達到自動配置的目的,然后我們在通過spring.factories也來進行配置

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.gw.GwAutoConfiguration

然后這樣一個簡單的stater就完成了,然后可以進行maven的打包,在其他項目引入就可以使用,在這里列出代碼地址

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • XML
    XML
    +關(guān)注

    關(guān)注

    0

    文章

    188

    瀏覽量

    33083
  • spring
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    14343
  • Boot
    +關(guān)注

    關(guān)注

    0

    文章

    149

    瀏覽量

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

    關(guān)注

    0

    文章

    18

    瀏覽量

    2674
  • SpringBoot
    +關(guān)注

    關(guān)注

    0

    文章

    173

    瀏覽量

    178
收藏 人收藏

    評論

    相關(guān)推薦

    SpringBoot配置Mybatis的2個錯誤和修正

    SpringBoot】配置Mybatis錯誤
    發(fā)表于 04-19 10:31

    Spring Boot的注解原理是什么

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

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

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

    Spring Boot常用注解與使用方式

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

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

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

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

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

    什么是 SpringBoot

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

    SpringBoot常用注解及使用方法1

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

    SpringBoot常用注解及使用方法2

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

    Springboot常用注解合集

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

    SpringBoot常用注解及原理

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

    SpringBoot核心注解1

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

    springboot核心注解

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

    一個注解搞定SpringBoot接口防刷

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

    SpringBoot核心注解由幾個注解組成

    簡化應用程序開發(fā)的注解,其中核心注解包括 @SpringBootApplication、@RestController、@RequestMapping、@Autowired、@ComponentScan
    的頭像 發(fā)表于 12-03 15:09 ?760次閱讀
    主站蜘蛛池模板: 欧美日操| 波多野结衣一级特黄毛片| 插插好爽爽爽| 伊人亚洲| 九九99视频在线观看视频观看| 天天操天天拍| 男女全黄做爰视频| 欧美精品二区| 色天天网| 激情亚洲婷婷| 精品伊人久久大线蕉色首页| 日本三级456| 国产精品免费一级在线观看| 美脚连裤袜老师正在播放| 天堂网| 国产精品视频第一区二区三区| 久热九九| 一级特黄特黄的大片免费| 狠狠五月深爱婷婷网免费| 国产天天操| 亚洲第8页| aa黄色大片| tube 69sex 第一次| 狠狠五月天小说| 伊人涩| 成年免费大片黄在线观看免费| 欧美性猛交xxxx乱大交中文| 色福利网| 理论在线看| 亚洲成人资源| 亚洲一级色片| 狠狠色噜噜狠狠狠狠888奇米| 狠狠色视频| 看黄网站在线| 欧美三级第一页| 国产香蕉久久精品综合网| 天堂bt在线| 手机看片久久| 亚洲wwww| 天天草天天爽| 亚洲成年人网|