2017-06-27 20 views
0

としてインスタンスを登録春ブーツ私はJavaコード(春・ブートプロジェクト)内のBeanとしてデータソースインスタンスを登録しようとしています豆

は、私が書いたものです。 (このコードは動作しません。)

@Configuration 
public class DatabaseConfig { 

    private Logger logger = Logger.getLogger(DatabaseConfig.class); 

    @Autowired 
    ApplicationContext context; 

    private Map<String, Map<String, String>> dsMap; 


    private Map<String, String> getTestDataSourceInfo() { 
     Map<String, String> ds = new HashMap<String, String>(); 
     ds.put("driverClassName", "com.mysql.jdbc.Driver"); 
     ds.put("url", "jdbc:mysql://123.456.78.912:3306/test"); 
     ds.put("username", "testuser"); 
     ds.put("password", "testuser"); 
     return ds; 
    } 

    public DatabaseConfig() { 
     this.dsMap = new HashMap<String, Map<String, String>>(); 
     dsMap.put("sampleDs", getTestDataSourceInfo()); 
    } 

    @PostConstruct 
    public void loadDataSource() { 

     logger.info("DS ================================ :: " + String.valueOf(this.dsMap)); 
     this.dsMap.forEach((k,v) -> { 

      logger.info("value ========================== :: " + String.valueOf(v)); 
      DataSource aSource = DataSourceBuilder.create() 
        .driverClassName(v.get("driverClassName")) 
        .url(v.get("url")) 
        .username(v.get("username")) 
        .password(v.get("password")) 
        .build(); 
      // PROBLEM STARTS .............. 
      // Add datasource instance with name to context 

      context.getAutowireCapableBeanFactory().autowireBean(aSource); 
     }); 
    } 
} 

インスタンスにBeanを登録するための任意の適切な方法はありますか? 私はこれのための良いサンプルを見つけることができませんでした。私は上記のコードで期待されている何FYI


、...

  • 春ブートアプリケーションが、それはそのコンストラクタでJavaインスタンスを作成しますConfigure
  • としてクラスの上に読みます
  • そして、インスタンスをBeanとしてアプリケーションコンテキストに追加します。loadDatasourceメソッド

しかし、動作していません。ですから、現在のSpring起動アプリケーションコンテキストにBeanとしてJavaインスタンスを追加する方法が不思議です。

+0

スプリングブートには、データソース用の自動設定が付属しています。https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.htmlこれを使用する必要はありませんが、いずれにしても、スタンドアローン(自分自身を登録する)またはaut-configのいずれかで使用する方法を示すことができます – pandaadb

+0

@pandaadb参考にしてくれてありがとうございました。私が知りたいのは、組み込みデータソースBeanの使い方ではなく、Javaアプリケーションを現在のアプリケーションコンテキストにBeanとして登録する方法です。私は投稿でコンテンツを編集する。 –

答えて

1

DataSourceでこれを行わなかった場合、実際にはもっと簡単になる可能性があります。

スプリングブートは自動的にdataSourceを設定するので、この設定を最初に無効にする必要があります。ここで

は私が... @Configurationクラスでは上記のクラスで

@Configuration 
public class DatabaseConfig { 

    private Logger logger = Logger.getLogger(DatabaseConfig.class); 

    @Autowired 
    ApplicationContext context; 

    private Map<String, Map<String, String>> dsMap; 


    private Map<String, String> getTestDataSourceInfo() { 
     Map<String, String> ds = new HashMap<String, String>(); 
     ds.put("driverClassName", "${ your driverClassName }"); 
     ds.put("url", "${ your url }"); 
     ds.put("username", "${ your user }"); 
     ds.put("password", "${ your password }"); 
     return ds; 
    } 

    public DatabaseConfig() { 
     this.dsMap = new HashMap<String, Map<String, String>>(); 
     dsMap.put("sampleDs1", getTestDataSourceInfo()); 
     dsMap.put("sampleDs2", getTestDataSourceInfo()); 
    } 

    @PostConstruct 
    public void loadDataSource() { 
     BeanDefinitionRegistry registry = (BeanDefinitionRegistry) context.getAutowireCapableBeanFactory(); 
     this.dsMap.forEach((k,v) -> { 

      BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(BasicDataSource.class); 
      v.forEach((ds_key, ds_val) -> { 
       builder.addPropertyValue(ds_key, ds_val); 
      }); 
      BeanDefinition def = builder.getBeanDefinition(); 
      if(!registry.containsBeanDefinition(k)) registry.registerBeanDefinition(k, def); 
     }); 
    } 
} 

を目標

を達成するためにやったことですが、私はBeanDefinitionRegistryBeanDefinitionBuilderでのSpring BeanにJavaインスタンスを追加することができます。

これは単なるBeanの場合、ここで終了しますが、追加しようとしているのはDataSource beanです。追加作業が必要です。

ブートは自動的にDataSourceに設定されているため、カスタマイズしたデータソースを登録するには、この設定を無効にする必要があります。

@SpringbootApplicationクラスでは、@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})を追加してください。

これで、他のBeanにあるこれらのBeanを@Autowired@Qualifierでユーザーに割り当てることができます。

ありがとうございました。

関連する問題