日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

springboot启动类

發布時間:2023/12/18 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springboot启动类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔

文章目錄

  • 前言
  • 一、簡單回顧
  • 二、run方法的入參
  • 三、ComponentScan的掃描范圍
  • 總結


前言

提示:這里可以添加本文要記錄的大概內容:

springboot啟動流程有很多文章都介紹得很詳細了,今天我們換種方式來討論下啟動類。


提示:以下是本篇文章正文內容,下面案例可供參考

一、簡單回顧

1、首先快速創建一個springboot項目,編寫一個測試接口。

@RestController public class UserController {@RequestMapping("/test")public String getNameById(String id){System.out.println("測試接口入參,id="+id);return "lili";} }


接口正常,這是我們按默認方式創建項目。我們的啟動類也很簡單就是默認創建的。

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);} }

2、下面我們來改造下啟動類,demo1:將啟動類的注解去掉,run方法入參換一個配置類

import com.jy.demo.config.AopConfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;//@SpringBootApplication public class DemoApplication {public static void main(String[] args) {SpringApplication.run(AopConfig.class, args);} } import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.*;/*** @Author jy* @Date 2022/4/2 15:38* @Version 1.0*/ @Configuration @ComponentScan(basePackages = "com.jy.demo.controller") //@EnableAspectJAutoProxy @EnableAutoConfiguration //@Import(JyAfterFilter.class) public class AopConfig {}

啟動服務測試接口,發現服務正常啟動,接口調用也是正常

從目前來看這樣操作是沒有問題。那么我們再來試試demo2的方式修改,先新建兩個類具體位置如圖


從圖片中可以看出,main所在的類在app包下,配置類在最外層,這時我用TestApplication啟動,服務也是正常運行,測試接口也是正常調用成功

3、我們再修改下代碼,demo3:配置類也改一下

import com.jy.demo.config.AopConfig; import org.springframework.boot.SpringApplication;/*** @Author jy* @Date 2022/7/20 15:43* @Version 1.0*/ public class TestApplication {public static void main(String[] args) {SpringApplication.run(AopConfig.class, args);} }

服務啟動依然正常,接口測試也正常

我們幾種修改都能正常啟動,接口也正常調用,那么為什么可以呢?

二、run方法的入參

1、首先我們還是回顧下spring的注解模式

public class Demo9 {public static void main(String[] args) {ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AopConfig.class);applicationContext.publishEvent(new ApplicationEvent("監聽事件推送") {});Apple bean = applicationContext.getBean(Apple.class);bean.setId(1);System.out.println(bean);} } public void register(Class<?>... componentClasses) {Assert.notEmpty(componentClasses, "At least one component class must be specified");StartupStep registerComponentClass = this.getApplicationStartup().start("spring.context.component-classes.register").tag("classes", () -> Arrays.toString(componentClasses));this.reader.register(componentClasses);//注意這行代碼!!!!registerComponentClass.end();}

傳入的參數就是一個配置類,spring先將這個配置類注入容器,然后在BeanFactoryPostProccsor的實現中處理配置類帶來的該處理的對象。具體的操作可以看看Configuration注解解析,而springboot的啟動類中的run方法入參是什么呢?其實也是一個配置類,那么springboot是怎么用這個配置類的呢?

首先是將這個配置類放在SpringApplication的成員變量里,然后在run方法中的上下文應用準備的時候對配置類進行了處理。

// Load the sourcesSet<Object> sources = getAllSources();Assert.notEmpty(sources, "Sources must not be empty");load(context, sources.toArray(new Object[0]));listeners.contextLoaded(context); public Set<Object> getAllSources() {Set<Object> allSources = new LinkedHashSet<>();if (!CollectionUtils.isEmpty(this.primarySources)) {allSources.addAll(this.primarySources);}if (!CollectionUtils.isEmpty(this.sources)) {allSources.addAll(this.sources);}return Collections.unmodifiableSet(allSources);}

往下一步就是在load()方法中加載


這里因為我們看的配置類,所以進入第一個if中,再往里走就到了我們前面spring處理時的類似代碼了

圈上的這行代碼和前面提示注意的那行代碼就是一個意思了,到目前為止說清楚了,這個配置類被注冊到容器的過程,那么和我們啟動類的位置有什么關系呢?

三、ComponentScan的掃描范圍

細心的朋友可能已經發現,我們幾次修改的時候配置類的ComponentScan的value值是有所不同的,@SpringBootApplication的value值是默認空,而自己寫的配置類上的ComponentScan注解是加了路徑值的。兩者的區別在于,默認空的話,掃描路徑是按配置類所在的位置掃描同級及下級;有值的話就按填寫的值進行掃描同級及下級。這個操作在ConfigurationClassPostProcessor類處理配置類信息時處理的。而配置類的信息在前面已經說了是怎么注冊到容器中的,所以spring能處理到我們的啟動配置類,也順其自然的能處理到配置類上的掃描范圍。所以雖然我們修改了main方法文件所在的位置,修改了配置類的位置服務依然能正常啟用,接口也正常調用。

總結

唉,前面屁話了一堆,第三點就這么點東西說明了原因。最后再多一嘴,
既然啟動類的位置可以不在最外層,那springboot為什么要放在最外層呢?因為springboot不知道我們會寫些什么包路徑,所以放最外層從最外層往下掃描,將對象是否注入容器交給開發者(需要注入就加注解)。以上就是我的一點個人理解,歡迎大家斧正。大家一起加油!!!

總結

以上是生活随笔為你收集整理的springboot启动类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。