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

前言

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

其实,这个问题,在前面的文章中也有提到,http://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!!!

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

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

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

(0)

相关推荐

  • 解决springMVC 跳转js css图片等静态资源无法加载的问题

    web.xml中 servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-va

  • SpringCloud实战小贴士之Zuul的路径匹配

    不论是使用传统路由的配置方式还是服务路由的配置方式,我们都需要为每个路由规则定义匹配表达式,也就是上面所说的 path 参数.在Zuul中,路由匹配的路径表达式采用了Ant风格定义. Ant风格的路径表达式使用起来非常简单,它一共有下面这三种通配符: 通配符 说明 ? 匹配任意的单个字符 * 匹配任意数量的字符 ** 匹配任意数量的字符,支持多级目录 我们可以通过下表的示例来进一步理解这三个通配符的含义并参考着来使用: URL路径 说明 /user-service/? 它可以匹配 /user-s

  • 简单了解Spring中常用工具类

    文件资源操作 Spring 定义了一个 org.springframework.core.io.Resource 接口,Resource 接口是为了统一各种类型不同的资源而定义的,Spring 提供了若干 Resource 接口的实现类,这些实现类可以轻松地加载不同类型的底层资源,并提供了获取文件名.URL 地址以及资源内容的操作方法 访问文件资源 * 通过 FileSystemResource 以文件系统绝对路径的方式进行访问: * 通过 ClassPathResource 以类路径的方式进行

  • Spring注入Date类型的三种方法总结

    Spring注入Date类型的三种方法总结 测试Bean: public class DateBean { private Date birthday; public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } } 方式1:利用SimpleDateFormat的构造方法注入 <?xml version="1.0&quo

  • 详解SpringBoot 快速整合MyBatis(去XML化)

    序言: 此前,我们主要通过XML来书写SQL和填补对象映射关系.在SpringBoot中我们可以通过注解来快速编写SQL并实现数据访问.(仅需配置:mybatis.configuration.map-underscore-to-camel-case=true).为了方便大家,本案例提供较完整的层次逻辑SpringBoot+MyBatis+Annotation. 具体步骤 1. 引入依赖 在pom.xml 引入ORM框架(Mybaits-Starter)和数据库驱动(MySQL-Conn)的依赖.

  • springboot整合redis进行数据操作(推荐)

    redis是一种常见的nosql,日常开发中,我们使用它的频率比较高,因为它的多种数据接口,很多场景中我们都可以用到,并且redis对分布式这块做的非常好. springboot整合redis比较简单,并且使用redistemplate可以让我们更加方便的对数据进行操作. 1.添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starte

  • Spring Java-based容器配置详解

    装Java-based的配置 使用 @Import 注解 跟在Spring XML文件中使用<import>元素添加模块化的配置类似,@Import注解允许你加载其他配置类中的@Bean定义: @Configuration public class ConfigA { @Bean public A a() { return new A(); } } @Configuration @Import(ConfigA.class) public class ConfigB { @Bean public

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

    前言 今天收到一封邮件,大概内容如下:spring boot鼓励去配置化,那么怎么将第三方jar包中的xml去配置化了? 其实,这个问题,在前面的文章中也有提到,http://www.jb51.net/article/125700.htm 下面,我们就以Quartz定时任务为例,单独对这个问题来进行说明,如何实现去配置化. 如果不使用spring boot,我们配置一个简单的定时任务时,需要引入以下配置文件: <!-- 配置需要定时执行的任务类以及方法 --> <bean id=&quo

  • Spring Boot创建可执行jar包的实例教程

    传统的spring项目,可能大部分都要部署到web容器中,如Tomcat.Spring Boot提供了一种超级简单的部署方式,就是直接将应用打成jar包,在生产上只需要执行java -jar就可以运行了. 本篇文章就介绍如何创建可执行jar包,以及如何部署.运行和停止. 第一步,我们需要在pom.xml添加spring-boot-maven-plugin,添加在dependecies部分下面: <build> <plugins> <plugin> <groupId

  • spring boot实战之本地jar包引用示例

    部分情况下无法通过maven仓库直接下载需要的jar包,只能讲jar包下载至本地来使用,spring boot框架内通过maven加载第三方jar包可以通过以下方式来实现(本地jar放在lib/目录下),项目会打包为jar包来运行. 1.添加maven依赖 <dependency> <groupId>org.ansj</groupId> <artifactId>ansj_seg</artifactId> <version>3.0<

  • spring boot 加载web容器tomcat流程源码分析

    我本地的springboot版本是2.5.1,后面的分析都是基于这个版本 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.1</version> <relativePath/> <!-- lookup parent fr

  • Spring Boot项目添加外部Jar包以及配置多数据源的完整步骤

    前言 最近项目需要和Oracle数据库进行交互,然后我从Maven中央仓库下载数据库驱动jar包,但怎么都下不下来,我到Oracle官网上一看,我去,居然不让用Maven直接下(大学时候用过Oracle,很久远的事情了0rz),没办法我还是直接下载jar包放到我的项目里面吧.SpringBoot项目引入外部jar包是非常方便的,包含打引入外部jar等操作. 我的做法如下: 首先在src同级目录建一个lib文件夹,将第三方jar包放到这个文件内,比如我将ojdbc6.jar 这个jar包放到这个地

  • spring boot加载freemarker模板路径的方法

    1,之前用的eclipse开发工具来加载spring boot加载freemarker模板路径,现在换用idea却不能使用了,所以来记录一下 加载freemarker模板三种方式,如下 public void setClassForTemplateLoading(Class clazz, String pathPrefix); public void setDirectoryForTemplateLoading(File dir) throws IOException; public void

  • Spring中的spring.factories文件用法(Spring如何加载第三方Bean)

    目录 Spring的spring.factories文件用法 问题 解决 SpringBoot的扩展机制之Spring Factories 什么是 SPI机制 Spring Boot中的SPI机制 Spring Factories实现原理是什么 Spring Factories在Spring Boot中的应用 Spring的spring.factories文件用法 在springBoot中,它自动扫描包的时候,只会扫描自己模块下的类. 问题 如果我们不想被Spring容器管理的Bean的路径下不

  • Spring boot项目打包成jar运行的二种方法

    前言 最近公司有个项目需要移植到SpringBoot框架上,项目里面又有许多第三方jar包,在linux服务器上最方便的就是用jar的方式来运行SpringBoot项目了,因此我研究了2种打jar包的方式,记录如下,供大家参考: 1.通过maven插件,将所有依赖包都打包成一个jar包,然后通过java -jar xxx.jar方式运行 由于项目中有些jar包是第三方的,maven官方仓库没有,需要使用mvn install命令打包到本地,然后将其写入到pom.xml的依赖中,maven仓库有的

  • spring boot加载资源路径配置和classpath问题解决

    1.spring boot默认加载文件的路径: /META-INF/resources/ /resources/ /static/ /public/ 我们也可以从spring boot源码也可以看到: private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classp

  • Spring Boot加载配置文件的完整步骤

    前言 本文针对版本2.2.0.RELEASE来分析SpringBoot的配置处理源码,通过查看SpringBoot的源码来弄清楚一些常见的问题比如: SpringBoot从哪里开始加载配置文件? SpringBoot从哪些地方加载配置文件? SpringBoot是如何支持yaml和properties类型的配置文件? 如果要支持json配置应该如何做? SpringBoot的配置优先级是怎么样的? placeholder是如何被解析的? 带着我们的问题一起去看一下SpringBoot配置相关的源

随机推荐