我遵循本教程,以在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")
然后用@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");
}
}