在SpringBoot启动后 在Application类直接调用Bean类之中的方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/jianxia801/article/details/102685800

目录

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的方法

猜你喜欢

转载自blog.csdn.net/jianxia801/article/details/102685800