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