Определите боб DataSource на коде

Я хотел бы сделать "Первый Процесс Установки базы данных Access" в моем пружинном приложении и единственной вещи, которую я могу вообразить, поскольку решение состояло бы в том, чтобы инициализировать боб DataSource программно.

Мой текущий боб определяется как:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/catalog" />
    <property name="username" value="condominium" />
    <property name="password" value="password" />
    <property name="validationQuery" value="SELECT 1" />
    <property name="testOnBorrow" value="true" />
    <property name="defaultAutoCommit" value="false" />
    <property name="maxWait" value="5000" />
</bean>

но идеальная вещь состояла в том, чтобы загрузить его один в том, каждый раз, когда мне нужен он, и с параметром я определяю.

Сценарий - то, что пользователь (администратор) приходит к приложению в первый раз, когда и я прошу, чтобы он сервер, порт и каталог соединился. Я храню его во встроенном дб и в следующий раз, когда приложение запускается, боб может проверить, устанавливается ли параметр на встроенном дб и загружает его снова.

Действительно ли это возможно?

EDT: на @axtavt предложение я иду с прокси...

<bean id="dataSource" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="targetSource" ref="swappableDataSource"/>
</bean>
<bean name="swappableDataSource" class="org.springframework.aop.target.HotSwappableTargetSource">
    <constructor-arg ref="dummyDataSource"/>
</bean>
<bean id="dummyDataSource" factory-bean="dataSourceFactory" factory-method="createDataSource" destroy-method="close"/>
<bean id="dataSourceFactory" class="com.condominium.spring.factory.DataSourceFactory"/>

однажды с Прокси, реализованным, как я бросаю его к Исходному Бобу?

Object o = ctx.getBean("dataSource");
BasicDataSource ds = (BasicDataSource)o;

бросит java.lang. ClassCastException: $Proxy4 не может быть брошен к org.apache.commons.dbcp. BasicDataSource

7
задан Ruben Trancoso 14 March 2010 в 22:45
поделиться

2 ответа

Вы можете создать фабрику для создания DataSource , как хотите:

<bean id = "dataSourceFactory" class = "MyFactory" />

<bean id = "dataSource" factory-bean = "dataSourceFactory" factory-method = "createDataSource" />

-

public class MyFactory {
    public DataSource createDataSource() {
        ... // produce a DataSource
    }
}
2
ответ дан 7 December 2019 в 16:41
поделиться

Вы можете использовать внешние свойства соединения с базой данных:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${driver}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
    <property name="validationQuery" value="SELECT 1" />
    <property name="testOnBorrow" value="true" />
    <property name="defaultAutoCommit" value="false" />
    <property name="maxWait" value="5000" />
</bean>

Теперь Spring будет получать их из файла .properties, который загружается при запуске.

Еще одна вещь, о которой вам стоит подумать, если вы используете сервер приложений Java EE, - это пул соединений JNDI. У вас будет внешнее имя JNDI, а параметры подключения будут управляться администратором сервера приложений. Я бы сказал, что это предпочтительный способ сделать это. Прямо сейчас у вас все еще есть пароль в виде обычного текста - плохая идея.

1
ответ дан 7 December 2019 в 16:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: