如何将 Java Class 中的值注入 spring 中的数据源 Bean

How to inject values from Java Class to Datasource Bean in spring

这听起来像是一个新手问题。我想注入数据源属性(我在运行时获取)并将其注入 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;
    }

我想将这些值注入到应用程序中的数据源 bean-context.xml

   <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 class 向 bean 属性注入值。

谢谢

您需要创建一个 @Configuration class,其中的方法带有 @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;
    }
}

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

您可以尝试从您的方法中 return 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

The "user" and "password" properties will be added explicitly, so they do not need to be included here.

检查源代码,你可以看到如果用户名和密码为空,将打印一条类似 log("DBCP DataSource configured without a 'username'"); 的消息。但是 属性 将在那里可用。

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