簡體   English   中英

Spring 按類排序對 bean 進行排序

[英]Spring order beans by class ordering

我有兩個類,其中一個類應該在運行時首先在這兩個類中執行,但它正在以相反的方式發生。

頭等艙:

@Configuration
public class A(){
@Bean
public void methodA(){}

@Bean
public void methodB(){
        for(i=0;i<9;i++){
            B b = new B();
            b.setJdbcUrl();
            b.setUsername();
            b.setPassword();
        }
    }
}

第二類:

@Configuration
public class B() extends HikariConfig {
@Bean
public HikariDataSource mysqlDataSource(){}

@Bean(name = "someEntityManager")
public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {}

@Bean(name = "someTransactionManager")
public PlatformTransactionManager mysqlTransactionManager(@Qualifier("someEntityManager") EntityManagerFactory entityManagerFactory) {}

目前 Spring 遵循的順序是:
1) b.mysqlDataSource()
2) b.LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(EntityManagerFactoryBuilder builder)
3) b.PlatformTransactionManager mysqlTransactionManager(@Qualifier("someEntityManager") EntityManagerFactory entityManagerFactory)
4) a.methodA()
5) a.methodB()

我的順序應該是 Spring,如下所示:
1) a.methodA()
2) a.methodB()
3) b.mysqlDataSource()
4) b.LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(EntityManagerFactoryBuilder builder)
5) b.PlatformTransactionManager mysqlTransactionManager(@Qualifier("someEntityManager") EntityManagerFactory entityManagerFactory)

並且它還必須經過代碼,其中B類是唯一依賴於所有url,用戶名和密碼設置的A類,因此必須首先啟動A。

您可以使用@DependsOn:

@Configuration
public class A {

    @Bean
    public void methodA() {
    }

    @DependsOn("methodA")    
    @Bean
    public void methodB() {
        for (i = 0; i < 9; i++) {
            B b = new B();
            b.setJdbcUrl();
            b.setUsername();
            b.setPassword();
        }
    }
}

@Configuration
@DependsOn({"methodA", "methodB"})
public class B extends HikariConfig {

    @DependsOn("mysqlEntityManagerFactory")
    @Bean
    public HikariDataSource mysqlDataSource() {
    }

    @DependsOn("mysqlTransactionManager")
    @Bean(name = "someEntityManager")
    public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(EntityManagerFactoryBuilder builder) {
    }

    @Bean(name = "someTransactionManager")
    public PlatformTransactionManager mysqlTransactionManager(@Qualifier("someEntityManager") EntityManagerFactory entityManagerFactory) {
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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