一、场景如下:
1、使用@SpringBootApplication 主类,注意package
package ;
import ;
import ;
import ;
@SpringBootApplication
public class QuartzSampleApplication {
public static void main(String[] args) {
(, args);
}
}
2、使用@Configuration的配置类,注意比较package路径
package ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;
@Configuration
public class QuartzConfig {
@Bean(name = "exampleJob")
public JobDetailFactoryBean exampleJob() {
JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();
();
("myJob1");
("group1");
("this is my first job");
(true);
(QuartzConstant.QUARTZ_SPRING_CONTEXT_KEY);
JobDataMap dataMap = new JobDataMap();
("say", "Hello World");
(dataMap);
return jobDetailFactoryBean;
}
@Bean(value = "exampleJobTrigger")
public CronTriggerFactoryBean exampleJobTrigger(@Qualifier(value = "exampleJob") JobDetail jobDetail) {
CronTriggerFactoryBean triggerFactoryBean = new CronTriggerFactoryBean();
("task1");
("group1");
("0 0/1 * * * ?");
//(misfireInstruction);
(5);
("this is my ...");
(jobDetail);
return triggerFactoryBean;
}
}
基本情况就这样,启动时无法加载QuartzConfig 类中声明的@Bean
二、分析原因
找了一会发现是package路径的问题,如果将QuartzConfig类的package改为或地子package就能加载QuartzConfig类中声明的@Bean。@SpringBootApplication中包含@EnableAutoConfiguration,会自动加载
声明@SpringBootApplication的类的package及其子package下的@Configuration类,创建Bean。所以,如果带有@Configuration的配置类不在声明@SpringBootApplication的类的package及其子package下是不会自动加载。
三、解决办法
方法一:将带有@Configuration的配置类移动到声明@SpringBootApplication的类的package及其子package下
方法二:使用@Import或@ComponentScan
package ;
import ;
import ;
import ;
import ;
@SpringBootApplication
@Import(value = { })
public class QuartzSampleApplication {
public static void main(String[] args) {
(, args);
}
}