[英]exclusive Spring profiled beans and DependsOn annotation
適用於我的代碼:
數據庫配置的一部分如下所示:
@Profile("!dbClean")
@Bean(initMethod = "migrate")
public Flyway flywayNotADestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setInitOnMigrate(true);
return flyway;
}
@Profile("dbClean")
@Bean(initMethod = "migrate")
public Flyway flywayTheDestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setInitOnMigrate(true);
flyway.clean();
return flyway;
}
配置代表兩個獨占bean。 當存在“dbClean”配置文件時創建一個,而當不存在時創建另一個配置文件。 忍受我,忘記代碼重復。
另一種配置控制Quartz配置:
@Autowired
private Flyway flyway;
@Bean
public SchedulerFactoryBean quartzScheduler(Flyway flyway) throws SchedulerException {
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
quartzScheduler.setDataSource(dataSource);
quartzScheduler.setTransactionManager(transactionManager);
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setSchedulerName("mysuperduperthegratest-quartz-scheduler");
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
quartzScheduler.setJobFactory(jobFactory);
quartzScheduler.setQuartzProperties(schedulingProperties);
return quartzScheduler;
}
上面的作品就像一個魅力。 問題是Quartz配置沒有使用Flyway自動裝配的bean。 它只需要比Quartz調度程序更早創建這個bean。
所以理想的配置是:
數據庫部分:
@Profile("!dbClean")
@Bean(name = "flyway", initMethod = "migrate")
public Flyway flywayNotADestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setInitOnMigrate(true);
return flyway;
}
@Profile("dbClean")
@Bean(name = "flyway", initMethod = "migrate")
public Flyway flywayTheDestroyer() {
Flyway flyway = new Flyway();
flyway.setDataSource(dataSource());
flyway.setInitOnMigrate(true);
flyway.clean();
return flyway;
}
石英部分:
@Bean
@DependsOn({"flyway"})
public SchedulerFactoryBean quartzScheduler() throws SchedulerException {
SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
quartzScheduler.setDataSource(dataSource);
quartzScheduler.setTransactionManager(transactionManager);
quartzScheduler.setOverwriteExistingJobs(true);
quartzScheduler.setSchedulerName("mysuperduperthegratest-quartz-scheduler");
AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
jobFactory.setApplicationContext(applicationContext);
quartzScheduler.setJobFactory(jobFactory);
quartzScheduler.setQuartzProperties(schedulingProperties);
return quartzScheduler;
}
問題是最后的配置不起作用。 這兩個飛路豆都沒有被創建過。 我不明白為什么。 回到我使用xml配置時,我記得在不同的配置文件中有兩個具有相同名稱的bean。 它奏效了。 我在這里做錯了什么,或者這可能是Spring本身的一些錯誤? 通常我自己調試Spring,但是使用@Configuration邏輯的Spring部分是一個綠色的文件,我現在不能浪費時間。
我知道很久以前就問過這個問題,但我在Spring Boot項目中遇到了一個使用Quartz和Flyway的問題。
在flyway創建表之前,Quartz會嘗試啟動。 以下對我有用:
@DependsOn("flywayInitializer")
public SchedulerFactoryBean quartzScheduler() { ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.