简体   繁体   English

Spring 按类排序对 bean 进行排序

[英]Spring order beans by class ordering

I have two classes and one of the classes should execute first at run-time among-st the two but it's happening the other way around.我有两个类,其中一个类应该在运行时首先在这两个类中执行,但它正在以相反的方式发生。

First Class:头等舱:

@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();
        }
    }
}

Second Class:第二类:

@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) {}

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

My order should be followed by the Spring as:我的顺序应该是 Spring,如下所示:
1) a.methodA() 1) a.methodA()
2) a.methodB() 2) a.methodB()
3) b.mysqlDataSource() 3) b.mysqlDataSource()
4) b.LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(EntityManagerFactoryBuilder builder) 4) b.LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory(EntityManagerFactoryBuilder builder)
5) b.PlatformTransactionManager mysqlTransactionManager(@Qualifier("someEntityManager") EntityManagerFactory entityManagerFactory) 5) b.PlatformTransactionManager mysqlTransactionManager(@Qualifier("someEntityManager") EntityManagerFactory entityManagerFactory)

And it must also go through the code where class B is the only one which depends all the url,username and password settings class A, so A must be initiated first.并且它还必须经过代码,其中B类是唯一依赖于所有url,用户名和密码设置的A类,因此必须首先启动A。

You can use @DependsOn:您可以使用@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