2015-03-30 24 views
0

我有兩個DataSource bean和兩個DataSourceInitializer bean,每個DataSource都有一個bean。這些配置位於不同的類文件中,但兩個DataSourceInitializers都嘗試設置DataSourceOne。選擇DataSource bean以用於多個DataSourceInitializers

如何告訴DataSourceInitializerTwo使用(注入?)DataSourceTwo bean?

//Data Source 1 
@Bean 
public DataSource dataSourceOne() { 
    JdbcDataSource ds = new JdbcDataSource(); 
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app1\\;SET SCHEMA app1"); 
    ds.setUser("app1"); 
    ds.setPassword("app1"); 
    return ds; 
} 

@Bean 
public DataSourceInitializer dataSourceInitializerOne(final DataSource dataSource) { 
    final DataSourceInitializer initializer = new DataSourceInitializer(); 
    initializer.setDataSource(dataSource); 
    initializer.setDatabasePopulator(DatabasePopulator()); 
    return initializer; 
} 

//Data Source 2 
@Bean 
public DataSource dataSourceTwo() { 
    JdbcDataSource ds = new JdbcDataSource(); 
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app2\\;SET SCHEMA app2"); 
    ds.setUser("app2"); 
    ds.setPassword("app2"); 
    return ds; 
} 

@Bean 
public DataSourceInitializer dataSourceInitializerTwo(final DataSource dataSource) { 
    final DataSourceInitializer initializer = new DataSourceInitializer(); 
    initializer.setDataSource(dataSourceTwo); 
    initializer.setDatabasePopulator(databasePopulatorTwo()); 
    return initializer; 
} 

回答

0

DataSourceInitializer方法似乎根據參數名稱注入一個DataSource bean。簡單地使你的方法返回一個DataSource的名稱匹配你的合適的初始化方法採用的DataSource參數的名稱。

//Data Source 1 
@Bean 
public DataSource dataSourceOne() { 
    JdbcDataSource ds = new JdbcDataSource(); 
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app1\\;SET SCHEMA app1"); 
    ds.setUser("app1"); 
    ds.setPassword("app1"); 
    return ds; 
} 

@Bean 
public DataSourceInitializer dataSourceInitializerOne(final DataSource dataSourceOne) { 
    final DataSourceInitializer initializer = new DataSourceInitializer(); 
    initializer.setDataSource(dataSourceOne); 
    initializer.setDatabasePopulator(DatabasePopulator()); 
    return initializer; 
} 

//Data Source 2 
@Bean 
public DataSource dataSourceTwo() { 
    JdbcDataSource ds = new JdbcDataSource(); 
    ds.setUrl("jdbc:h2:mem:app1db;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2;INIT=CREATE SCHEMA IF NOT EXISTS app2\\;SET SCHEMA app2"); 
    ds.setUser("app2"); 
    ds.setPassword("app2"); 
    return ds; 
} 

@Bean 
public DataSourceInitializer dataSourceInitializerTwo(final DataSource dataSourceTwo) { 
    final DataSourceInitializer initializer = new DataSourceInitializer(); 
    initializer.setDataSource(dataSourceTwo); 
    initializer.setDatabasePopulator(databasePopulatorTwo()); 
    return initializer; 
} 
+0

我試過這個,但是腳本對它們執行了。不知何故,你需要在DataSourceInitializedEvent之後發生。有誰知道如何在SpringBoot應用程序中註冊DataSourceInitializedEvent?我創建了一個實現接口的類。我還將listerner添加到我的應用程序中:SpringApplication.run(Application.class).addApplicationListener(new MyDataSourceInitializer()); – anschoewe 2015-07-16 23:12:24

+0

此問題與SpringBoot和DataSourceInitializedEvent無關。製作自己的問題,而不是針對不同的問題解決問題。 – Roger 2015-07-20 19:49:23

+0

不夠公平,他們是不同的(但相關的)問題。我會撤銷我的downvote。跟進,(我剛試過,它不會讓我,它說它被鎖定,直到答案被編輯)。 – anschoewe 2015-07-21 21:35:23

相關問題