spring boot加载第三方jar包的配置文件的方法

 更新时间:2017年10月13日 10:11:50   作者:牛奋lch  
本篇文章主要介绍了spring boot加载第三方jar包的配置文件的方法,详细的介绍了spring boot jar包配置文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

今天收到一封邮件,大概内容如下:spring boot鼓励去配置化,那么怎么将第三方jar包中的xml去配置化了?

其实,这个问题,在前面的文章中也有提到,https://www.jb51.net/article/125700.htm

下面,我们就以Quartz定时任务为例,单独对这个问题来进行说明,如何实现去配置化。

如果不使用spring boot,我们配置一个简单的定时任务时,需要引入以下配置文件:

<!-- 配置需要定时执行的任务类以及方法 --> 
 <bean id="doJob" 
  class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
  <!-- 指定任务类 --> 
  <property name="targetObject" ref="schedulerTask" /> 
  <!-- 指定任务执行的方法 --> 
  <property name="targetMethod" value="doTask" /> 
  <property name="concurrent" value="false"></property> 
 </bean> 
  
 <!-- 配置触发器 --> 
 <bean id="jobTrigger" 
  class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> 
  <property name="jobDetail" ref="doJob" /> 
  <!-- 每5秒运行一次 --> 
  <property name="cronExpression" value="0/5 * * * * ?" /> 
 </bean> 
 
 <!-- 触发定时任务 --> 
 <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
  <property name="triggers"> 
   <list> 
    <ref bean="jobTrigger" /><!-- 此处可以配置多个触发器 --> 
   </list> 
  </property> 
  <property name="applicationContextSchedulerContextKey" value="applicationContextKey" /> 
  <property name="waitForJobsToCompleteOnShutdown" value="true"></property> 
 </bean> 

接下来的任务,就是如何将上面的xml配置文件,去配置化。

从上面的配置文件中,可以得出,我们需要配置3个实例,分别是JobDetail,JobTrigger和Scheduler。

1、首先抽取出需要在application.properties配置文件中配置的属性项,从上面的配置文件中,可以得出如下需要配置的属性项,对应的VO如下:

package com.chhliu.springboot.quartz.config; 
 
import org.springframework.boot.context.properties.ConfigurationProperties; 
 
@ConfigurationProperties(prefix="quartz.config") 
public class QuartzConfigProperties { 
 private String targetObject; 
  
 private String targetMethod; 
  
 private boolean concurrent; 
  
 private String cronExpression; 
  
 private String applicationContextSchedulerContextKey; 
  
 private boolean waitForJobsToCompleteOnShutdown; 
   
  ……省略getter、setter方法…… 
} 

2、在application.properties配置文件中,加入如下配置

quartz.config.targetObject=taskJob ## 待执行对象的名字 
quartz.config.targetMethod=doJob ## 待执行的方法的名字 
quartz.config.concurrent=false ## 是否并发,如果上一个定时任务还没有执行完,又被触发了,如果配置为false,则需等待上个任务执行完,才触发 
quartz.config.cronExpression=0/5 * * * * ? ## 任务触发表达式 
quartz.config.applicationContextSchedulerContextKey=applicationContextKey ## 通过该key可以获取spring上下文 
quartz.config.waitForJobsToCompleteOnShutdown=true ## 是否等待任务完全执行完后,再销毁线程池 

3、分别实例化JobDetail,JobTrigger和Scheduler 

package com.chhliu.springboot.quartz.entity; 
 
import org.quartz.Trigger; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.scheduling.quartz.CronTriggerFactoryBean; 
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; 
import org.springframework.scheduling.quartz.SchedulerFactoryBean; 
 
import com.chhliu.springboot.quartz.config.QuartzConfigProperties; 
 
/** 
 * 描述:将quartz的xml配置文件去配置化 
 * @author chhliu 
 * 创建时间:2017年4月11日 下午7:41:21 
 * @version 1.2.0 
 */ 
@Configuration 
public class QuartzConfig { 
  
 @Autowired 
 private QuartzConfigProperties properties; // 注入属性配置文件对应的类实例 
  
 /** 
  * attention: 
  * Details:初始化JobDetail 
  * @author chhliu 
  * 创建时间:2017年4月11日 下午6:17:06 
  * @param task 
  * @return 
  * MethodInvokingJobDetailFactoryBean 
  * @throws ClassNotFoundException 
  * @throws IllegalAccessException 
  * @throws InstantiationException 
  */ 
 @Bean(name = "jobDetail") 
 public MethodInvokingJobDetailFactoryBean detailFactoryBean() throws ClassNotFoundException, InstantiationException, IllegalAccessException {// ScheduleTask为需要执行的任务 
  MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); 
  /* 
   * 是否并发执行 
   * 例如每5s执行一次任务,但是当前任务还没有执行完,就已经过了5s了, 
   * 如果此处为true,则下一个任务会执行,如果此处为false,则下一个任务会等待上一个任务执行完后,再开始执行 
   */ 
  jobDetail.setConcurrent(properties.isConcurrent()); 
   
  /* 
   * 为需要执行的实体类对应的对象 
   */ 
  String targetObject = properties.getTargetObject(); 
  jobDetail.setTargetBeanName(targetObject); 
   
  /* 
   * 通过这几个配置,告诉JobDetailFactoryBean我们需要定时执行targetObject类中的properties.getTargetMethod()方法 
   */ 
  jobDetail.setTargetMethod(properties.getTargetMethod()); 
  return jobDetail; 
 } 
  
 /** 
  * attention: 
  * Details:实例化JobTrigger 
  * @author chhliu 
  * 创建时间:2017年4月11日 下午7:39:14 
  * @param jobDetail 
  * @return 
  * CronTriggerFactoryBean 
  */ 
 @Bean(name = "jobTrigger") 
 public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) { 
  CronTriggerFactoryBean tigger = new CronTriggerFactoryBean(); 
  tigger.setJobDetail(jobDetail.getObject()); 
  tigger.setCronExpression(properties.getCronExpression()); 
  return tigger; 
 
 } 
  
 /** 
  * attention: 
  * Details:实例化Scheduler 
  * @author chhliu 
  * 创建时间:2017年4月11日 下午7:39:35 
  * @param cronJobTrigger 
  * @return 
  * SchedulerFactoryBean 
  */ 
 @Bean(name = "scheduler") 
 public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger) { 
  SchedulerFactoryBean bean = new SchedulerFactoryBean(); 
  // 注册触发器 
  bean.setTriggers(cronJobTrigger); 
  // 通过applicationContextSchedulerContextKey属性配置获取spring上下文 
  bean.setApplicationContextSchedulerContextKey(properties.getApplicationContextSchedulerContextKey()); 
  // 关闭任务的时候,是否等待任务执行完毕 
  bean.setWaitForJobsToCompleteOnShutdown(properties.isWaitForJobsToCompleteOnShutdown()); 
  return bean; 
 } 
} 

4、编写需要执行的方法 

package com.chhliu.springboot.quartz.job; 
 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Service; 
 
@Service("taskJob") 
public class TaskJob { 
 private static final Logger LOGGER = LoggerFactory.getLogger(TaskJob.class); 
 public void doJob(){ 
  LOGGER.info("hello spring boot, i'm the king of the world!!!"); 
 } 
} 

5、测试

package com.chhliu.springboot.quartz; 
 
import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.context.properties.EnableConfigurationProperties; 
 
import com.chhliu.springboot.quartz.config.QuartzConfigProperties; 
 
@SpringBootApplication 
@EnableConfigurationProperties({QuartzConfigProperties.class} ) // 开启配置属性支持 
public class SpringbootQuartzApplication { 
 
 public static void main(String[] args) { 
  SpringApplication.run(SpringbootQuartzApplication.class, args); 
 } 
} 

6、测试结果如下 

2017-04-11 19:09:35.017 INFO 7500 --- [eduler_Worker-1] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!! 
2017-04-11 19:09:40.004 INFO 7500 --- [eduler_Worker-2] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!! 
2017-04-11 19:09:45.004 INFO 7500 --- [eduler_Worker-3] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!! 
2017-04-11 19:09:50.004 INFO 7500 --- [eduler_Worker-4] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!! 
2017-04-11 19:09:55.001 INFO 7500 --- [eduler_Worker-5] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!! 
2017-04-11 19:10:00.002 INFO 7500 --- [eduler_Worker-6] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!! 
2017-04-11 19:10:05.001 INFO 7500 --- [eduler_Worker-7] c.chhliu.springboot.quartz.job.TaskJob : hello spring boot, i'm the king of the world!!! 

从上面的测试结果可以看出,任务被触发了,也得到了正确的结果。

上面的这个示例,只是一个简单的例子,但是生产上复杂的需求,原理也是类似的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring Cloud原理以及核心组件详解

    Spring Cloud原理以及核心组件详解

    这篇文章主要介绍了Spring Cloud原理以及核心组件详解,spring cloud有5个核心组件,文章中进行了一一的详细介绍,需要的朋友可以参考下
    2023-03-03
  • 设计模式之构建(Builder)模式 建造房子实例分析

    设计模式之构建(Builder)模式 建造房子实例分析

    构建模式主要用来针对复杂产品生产,分离部件构建细节,以达到良好的伸缩性,考虑到设计模式来源于建筑学,因此举一个建造房子的例子,需要的朋友可以参考下
    2012-12-12
  • springboot手动事务回滚的实现代码

    springboot手动事务回滚的实现代码

    这篇文章主要介绍了springboot手动事务回滚的实现方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • 探究Java常量本质及三种常量池(小结)

    探究Java常量本质及三种常量池(小结)

    这篇文章主要介绍了探究Java常量本质及三种常量池(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • JavaWeb项目部署到服务器详细步骤详解

    JavaWeb项目部署到服务器详细步骤详解

    这篇文章主要介绍了JavaWeb项目如何部署到服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • Spring入门配置和DL依赖注入实现图解

    Spring入门配置和DL依赖注入实现图解

    这篇文章主要介绍了Spring入门配置和DL依赖注入实现图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot单元测试之数据隔离详解

    SpringBoot单元测试之数据隔离详解

    我们在写单元测试时,有一个比较重要的要求是可以重复运行, 那么这样就会有一个比较麻烦的问题:数据污染,所以本文为大家整理了两个数据隔离的方式,希望对大家有所帮助
    2023-08-08
  • IDEA如何实现右键翻译

    IDEA如何实现右键翻译

    这篇文章主要介绍了IDEA如何实现右键翻译问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • JAVA基础之控制台输入输出的实例代码

    JAVA基础之控制台输入输出的实例代码

    下面小编就为大家带来一篇JAVA基础之控制台输入输出的实例代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 基于java流实现压缩图片过程解析

    基于java流实现压缩图片过程解析

    这篇文章主要介绍了基于java流实现压缩图片过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10

最新评论