springboot加载第三⽅jar包的配置⽂件的⽅法
前⾔
今天收到⼀封邮件,⼤概内容如下:spring boot⿎励去配置化,那么怎么将第三⽅jar包中的xml去配置化了?
下⾯,我们就以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.fig;
import org.t.properties.ConfigurationProperties;
@ConfigurationProperties(prefix="fig")
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配置⽂件中,加⼊如下配置
3、分别实例化JobDetail,JobTrigger和Scheduler
package com.chhliu.ity;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import t.annotation.Bean;
import t.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import com.chhliu.fig.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 = TargetObject();
jobDetail.setTargetBeanName(targetObject);
/*
* 通过这⼏个配置,告诉JobDetailFactoryBean我们需要定时执⾏targetObject类中的TargetMethod()⽅法
*/
jobDetail.TargetMethod());
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.Object());
tigger.CronExpression());
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.ApplicationContextSchedulerContextKey());
// 关闭任务的时候,是否等待任务执⾏完毕
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 = Logger(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.t.properties.EnableConfigurationProperties;
mysql下载jar包import com.chhliu.fig.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 从上⾯的测试结果可以看出,任务被触发了,也得到了正确的结果。
上⾯的这个⽰例,只是⼀个简单的例⼦,但是⽣产上复杂的需求,原理也是类似的。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。