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