春季批次@Primary注释覆盖不正确的bean



我遵循本教程,以在Java中配置弹簧批处理作业。它通过使用然后由每个数据源实现的界面来为多个数据源提供。

这是我到目前为止所拥有的:

InfrastrestureConfig.java

public interface InfrastructureConfiguration {
    @Bean
    DataSource dataSource();
}

mysqlconfig.java

@Configuration
@Primary
public class MySQLConfiguration implements InfrastructureConfiguration {
    @Bean
    public DataSource dataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/employees?useSSL=false");
        dataSource.setUsername("testing");
        dataSource.setPassword("testing");
        return dataSource;
    }
}

postgresqlconfig.java

@Configuration
public class PostgreSQLConfiguration implements InfrastructureConfiguration {
    @Bean
    public DataSource dataSource() {
        final DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.postgresql.Driver");
        dataSource.setUrl("jdbc:postgresql://localhost:5432/postgres");
        dataSource.setUsername("postgres");
        dataSource.setPassword("testing");
        return dataSource;
    }
}

jobconfig.java

@Configuration
public class JobConfig {
    @Autowired
    private InfrastructureConfig infrastructureConfig
    ....
}

通过对我的mysqlconfig使用@Primary注释,我希望使用mysqlconfig bean。相反,我明白了:

2017-03-09 12:46:21.422信息1496 --- [main] O.S.B.F.S.DefaultListableBeanFactory:bean'dataSource'的bean定义具有不同的定义:替换[root bean:clast bean:class [null];范围=;摘要= false;lazyinit = false;AutowireMode = 3;depentencyCheck = 0;autowirecandidate = true;primary = false;FactoryBeanName = mysqlConfiguration;FactoryMethodName = DataSource;initmethodname = null;destroythodname =(推断);在类路径资源[config/mysqlconfiguration.class]]中定义的,[root bean:class [null];范围=;摘要= false;lazyinit = false;AutowireMode = 3;depentencyCheck = 0;autowirecandidate = true;primary = false;FactoryBeanName = PostgreSqlConfiguration;FactoryMethodName = DataSource;initmethodname = null;destroythodname =(推断);在类路径资源[config/postgresqlconfiguration.class]中定义]

它用postgresqlconfig bean覆盖了mysqlconfig bean,从而使用PostgreSQL驱动程序。问题是,为什么?

@Primary放在方法上(@Bean旁边),而不是在类级别上。

尝试使用@Qualifier(name = ""),然后明确选择您想要的实例。

您在接口方法上有@Bean注释也很奇怪。此外,使用autowire @configuration课程对我来说看起来不好。它们是用于实例化豆的基于Java的配置。

您可以尝试@Profiles注释。

带有@Profile("mySql")的注释MySQL配置类,以及带有@Profile("myPostgresql")

的Postgres配置

然后用@ActiveProfiles("mySql")注释JobConfig配置。这样,JobConfig应该忽略Postgres配置。

说您在测试中使用MySQL,可以用@ActiveProfiles("mySql")

注释测试类

春季配置文件文档

文档中的示例:

@Configuration
public class AppConfig {
  @Bean("dataSource")
  @Profile("development") 
  public DataSource standaloneDataSource() {
    return new EmbeddedDatabaseBuilder()
        .setType(EmbeddedDatabaseType.HSQL)
        .addScript("classpath:com/bank/config/sql/schema.sql")
        .addScript("classpath:com/bank/config/sql/test-data.sql")
        .build();
  }
  @Bean("dataSource")
  @Profile("production") 
  public DataSource jndiDataSource() throws Exception {
    Context ctx = new InitialContext();
    return (DataSource) ctx.lookup("java:comp/env/jdbc/datasource");
  }
}

最新更新