在SpringBoot啓動後 在Application類直接調用Bean類之中的方法

目錄

1、應用場景直擊

2、代碼實現

2.1、使用static方式獲得Bean實例

2.2、在Application之中直接獲得配置信息

3、總結

4、參考文章


1、應用場景直擊

        最近因爲公司變化;要求把以前在百度雲上的音視頻文件和文檔遷移到阿里雲環境下。因爲本人被分派了此任務要求把百度雲賬號(2個)、其中一個賬號直接下載文件;另外一個賬號需要按照系統下載文件。於是我想到寫了一個獨立的SpringBoot程序,因爲涉及文件衆多;其中一個賬號多達230G文件;另外一個賬號文件涉及多達850G。於是乎需要寫一個程序多臺機器進行下載;並且要求支持按照分頁下載。最後使用3臺計算機;讓運維人員針對此三臺計算機進行分配 固定大帶寬 。舉例一下:無論是在百度雲上以視頻管理的分頁還是按照系統下載的分頁下載。

    機器A上 下載 1-30頁

    機器B上  下載31-60頁

    機器C上 下載61-100頁

     這樣三臺機器可以同時分開下載;同時擁有固定帶寬;這樣基礎硬件條件準備好了。於是需要在程序之中把相關配置寫到配置文件之中,獲得當前下載類型、同時啓動完畢SpringBoot後直接調用對應的下載程序下載文件即可。

     在spring框架中,是無法在普通類中通過註解注入實例的,因爲sping框架在啓動的時候,就會將標明交給spring容器管理的類進行實例化,並梳理他們彼此的依賴關係,進行注入,沒有交給spring容器管理的普通類,是不會進行注入的,即使你使用了注入的相關注解。這個時候,如果我們需要在普通類中獲取spring容器中的實例,就需要一些特定的方法。

2、代碼實現

2.1、使用static方式獲得Bean實例

import org.springframework.context.ConfigurableApplicationContext;

public class BeanUtil {
    //將管理上下文的applicationContext設置成靜態變量,供全局調用
    public static ConfigurableApplicationContext applicationContext;
    //定義一個獲取已經實例化bean的方法
    public static <T> T getBean(Class<T> c){
        return applicationContext.getBean(c);
    }
}

Application類之中如何通過 applicationContext 獲得bean

@SpringBootApplication( exclude = { DataSourceAutoConfiguration.class } )
@ComponentScan( basePackages = { "com.wdcloud.publiccloud.files.tool" } )
@ServletComponentScan
public class PublicCloudFilesMigrationToolsApplication {
	private static Logger logger = LoggerFactory.getLogger( PublicCloudFilesMigrationToolsApplication.class );

	public static void main( String[] args ) throws IOException
	{
		/* run方法的返回值ConfigurableApplicationContext繼承了ApplicationContext上下文接口 */
		ConfigurableApplicationContext applicationContext = SpringApplication.run( PublicCloudFilesMigrationToolsApplication.class, args );
		/* 將run方法的返回值賦值給工具類中的靜態變量 */
		BeanUtil.applicationContext = applicationContext;
		System.out.println( "currentOperateType " + currentOperateType );
		switch ( currentOperateType )
		{
		case "video":
			logger.info( "主程序啓動完畢 進入下載視頻調用 " );
			runDownloadVodFileBySystem();
			break;
		}
	}

	/* 調用  注意Application是我們SpringBoot的啓動類 */
	public static void runDownloadVodFileBySystem()
	{
		/* 測試獲取已經實例化的接口bean,執行bean中方法 */
		DownloadVodMediaByAppSystem downloadVodMediaByAppSystem = BeanUtil.getBean( DownloadVodMediaByAppSystem.class );
		downloadVodMediaByAppSystem.downloadVodMeidaAppSystemPageList(
			downloadStartPage, downloadEndPage,
			pageSize, ownerCompany, fileFormat,
			downloadStartTime, downloadEndTime, pageStartIndex, pageEndIndex );
	}
}

2.2、在Application之中直接獲得配置信息

application-prod.properties 之中的文件信息

#當前的企業id **大學 10001 寧波江北區考試系統 10015 
ownerCompany=10011

*Application.java之中代碼獲得配置信息

 //從配置文件之中讀取
    private static String ownerCompany;
    @Value("${ownerCompany}")
    public void setOwnerCompany(String ownerCompany) {
      this.ownerCompany = ownerCompany;
    }

    //下載總文件數量
    private static int downloadFileTotal;
    @Value("${downloadFileTotal}")
    public void setDownloadFileTotal(int downloadFileTotal) {
      this.downloadFileTotal = downloadFileTotal;
    }
       
    private static int downloadStartPage;
    @Value("${downloadStartPage}")
    public void setDownloadStartPage(int downloadStartPage) {
      this.downloadStartPage = downloadStartPage;
    }
    
    private static int downloadEndPage;  
    @Value("${downloadEndPage}")
    public void setDownloadEndPage(int downloadEndPage) {
      this.downloadEndPage = downloadEndPage;
    }
    
    private static int pageSize;
    @Value("${pageSize}")
    public void setPageSize(int pageSize) {
      this.pageSize = pageSize;
    }
    

3、總結

     本文主要是結合實際之中在SpringBoot應用之中如何獲得Bean對象;然後通過Bean對象直接調用對應的方法執行。

同時在Application類之中如果獲得配置文件之中的信息。在啓動應用的時候要獲得信息,需要把配置信息變量定義爲static類型同時使用set方式賦值。如下圖所示:

 //從配置文件之中讀取
    private static String ownerCompany;
    @Value("${ownerCompany}")
    public void setOwnerCompany(String ownerCompany) {
      this.ownerCompany = ownerCompany;
    }

4、參考文章

SpringBoot 普通類獲取spring容器中bean的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章