如何在Spring中将值从Java类注入到Datasource Bean

时间:2016-03-09 20:28:57

标签: java spring spring-jdbc applicationcontext

这听起来像是一个新手问题。我想注入数据源属性(我在运行时获取)并将其注入bean ..

我的javaclass中有一个方法......

public <String,String>map myMethod(Map<String, String> model) {

        Map mapA = new HashMap();
        mapA.put("username", "element 1");
        mapA.put("password", "element 2");
        mapA.put("host", "element 3");

        return map;
    }

我想将这些值注入application-context.xml

中的数据源bean
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value=""/> // inject values here
        <property name="url" />
        <property name="username" />
        <property name="password" />
    </bean>

我已经看到很多关于使用属性文件向bean注入值的示例,但我无法弄清楚如何将java类中的值注入bean属性。

由于

2 个答案:

答案 0 :(得分:2)

您需要使用@Configuration注释的方法创建@Bean类,并返回org.apache.commons.dbcp.BasicDataSource的实例。

@Configuration
public class DatasourceConfiguration {

    @Bean
    public BasicDataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(""); // you can call your code here 
        ds.setUrl(""); // to get these configuration values
        ds.setUsername("");
        ds.setPassword("");
        return ds;
    }
}

答案 1 :(得分:0)

这可能是一个不太优雅的解决方案,但这种方法呢?

您可以尝试从方法中返回String

@Configuration
public class DatasourceConfiguration2 {
    @Bean
    public String getDataSourceSetting() {
        Map<String, String> map = myMethod(model); //assuming that you are not able to edit the original method
        StringBuilder sb = new StringBuilder();
        for (Entry<String, String> e : map.entrySet()) {
            sb.append(e.getKey()).append('=').append(e.getValue()).append(';');
        }
    }
}

在xml中,您可以定义属性,如:

 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="connectionProperties" value="dataSourceSetting"/> 
    </bean>

基于dbcp api

  

将明确添加“user”和“password”属性,因此不需要包含它们。

检查源代码,您可以看到用户和密码是否为空,将打印log("DBCP DataSource configured without a 'username'");之类的消息。但该物业将在那里提供。

最后,如果url属性没有选项,则需要明确设置。