Как вводить значения из класса Java в компонент источника данных весной

Это может звучать как вопрос новичка. Я хочу внедрить свойства источника данных (которые я получаю во время выполнения) и внедрить их в компонент.

У меня есть метод в моем 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 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-компонента.

Спасибо


person Gendaful    schedule 09.03.2016    source источник
comment
Является ли Spring Boot вариантом? Он сделает это за вас из коробки.   -  person chrylis -cautiouslyoptimistic-    schedule 10.03.2016


Ответы (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;
    }
}
person Adam Siemion    schedule 09.03.2016

Это может быть не очень элегантное решение, но как насчет этого подхода?

Вы можете попытаться вернуть 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:

Свойства «пользователь» и «пароль» будут добавлены явно, поэтому их не нужно указывать здесь.

Проверяя исходный код, вы можете увидеть, что если пользователь и пароль равны нулю, будет напечатано сообщение типа log("DBCP DataSource configured without a 'username'");. Но недвижимость там будет доступна.

Наконец, в случае свойства url опции нет, вам нужно настроить ее явно.

person josivan    schedule 10.03.2016