当前位置:   article > 正文

在SpringBoot启动后 在Application类直接调用Bean类之中的方法_启动spring boot获取定时任务的bean直接调用方法

启动spring boot获取定时任务的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实例

  1. import org.springframework.context.ConfigurableApplicationContext;
  2. public class BeanUtil {
  3. //将管理上下文的applicationContext设置成静态变量,供全局调用
  4. public static ConfigurableApplicationContext applicationContext;
  5. //定义一个获取已经实例化bean的方法
  6. public static <T> T getBean(Class<T> c){
  7. return applicationContext.getBean(c);
  8. }
  9. }

Application类之中如何通过 applicationContext 获得bean

  1. @SpringBootApplication( exclude = { DataSourceAutoConfiguration.class } )
  2. @ComponentScan( basePackages = { "com.wdcloud.publiccloud.files.tool" } )
  3. @ServletComponentScan
  4. public class PublicCloudFilesMigrationToolsApplication {
  5. private static Logger logger = LoggerFactory.getLogger( PublicCloudFilesMigrationToolsApplication.class );
  6. public static void main( String[] args ) throws IOException
  7. {
  8. /* run方法的返回值ConfigurableApplicationContext继承了ApplicationContext上下文接口 */
  9. ConfigurableApplicationContext applicationContext = SpringApplication.run( PublicCloudFilesMigrationToolsApplication.class, args );
  10. /* 将run方法的返回值赋值给工具类中的静态变量 */
  11. BeanUtil.applicationContext = applicationContext;
  12. System.out.println( "currentOperateType " + currentOperateType );
  13. switch ( currentOperateType )
  14. {
  15. case "video":
  16. logger.info( "主程序启动完毕 进入下载视频调用 " );
  17. runDownloadVodFileBySystem();
  18. break;
  19. }
  20. }
  21. /* 调用 注意Application是我们SpringBoot的启动类 */
  22. public static void runDownloadVodFileBySystem()
  23. {
  24. /* 测试获取已经实例化的接口bean,执行bean中方法 */
  25. DownloadVodMediaByAppSystem downloadVodMediaByAppSystem = BeanUtil.getBean( DownloadVodMediaByAppSystem.class );
  26. downloadVodMediaByAppSystem.downloadVodMeidaAppSystemPageList(
  27. downloadStartPage, downloadEndPage,
  28. pageSize, ownerCompany, fileFormat,
  29. downloadStartTime, downloadEndTime, pageStartIndex, pageEndIndex );
  30. }
  31. }

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

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

  1. #当前的企业id **大学 10001 宁波江北区考试系统 10015
  2. ownerCompany=10011

*Application.java之中代码获得配置信息

  1. //从配置文件之中读取
  2. private static String ownerCompany;
  3. @Value("${ownerCompany}")
  4. public void setOwnerCompany(String ownerCompany) {
  5. this.ownerCompany = ownerCompany;
  6. }
  7. //下载总文件数量
  8. private static int downloadFileTotal;
  9. @Value("${downloadFileTotal}")
  10. public void setDownloadFileTotal(int downloadFileTotal) {
  11. this.downloadFileTotal = downloadFileTotal;
  12. }
  13. private static int downloadStartPage;
  14. @Value("${downloadStartPage}")
  15. public void setDownloadStartPage(int downloadStartPage) {
  16. this.downloadStartPage = downloadStartPage;
  17. }
  18. private static int downloadEndPage;
  19. @Value("${downloadEndPage}")
  20. public void setDownloadEndPage(int downloadEndPage) {
  21. this.downloadEndPage = downloadEndPage;
  22. }
  23. private static int pageSize;
  24. @Value("${pageSize}")
  25. public void setPageSize(int pageSize) {
  26. this.pageSize = pageSize;
  27. }

3、总结

     本文主要是结合实际之中在SpringBoot应用之中如何获得Bean对象;然后通过Bean对象直接调用对应的方法执行。

同时在Application类之中如果获得配置文件之中的信息。在启动应用的时候要获得信息,需要把配置信息变量定义为static类型同时使用set方式赋值。如下图所示:

  1. //从配置文件之中读取
  2. private static String ownerCompany;
  3. @Value("${ownerCompany}")
  4. public void setOwnerCompany(String ownerCompany) {
  5. this.ownerCompany = ownerCompany;
  6. }

4、参考文章

SpringBoot 普通类获取spring容器中bean的方法

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/1017619
推荐阅读
相关标签
  

闽ICP备14008679号