Я хотел бы сделать "Первый Процесс Установки базы данных 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
Вы можете создать фабрику для создания DataSource
, как хотите:
<bean id = "dataSourceFactory" class = "MyFactory" />
<bean id = "dataSource" factory-bean = "dataSourceFactory" factory-method = "createDataSource" />
-
public class MyFactory {
public DataSource createDataSource() {
... // produce a DataSource
}
}
Вы можете использовать внешние свойства соединения с базой данных:
<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, а параметры подключения будут управляться администратором сервера приложений. Я бы сказал, что это предпочтительный способ сделать это. Прямо сейчас у вас все еще есть пароль в виде обычного текста - плохая идея.