簡體   English   中英

獨有的Spring profiled bean和DependsOn注釋

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM