Определить компонент DataSource в коде - PullRequest
7 голосов
/ 14 марта 2010

Я хотел бы выполнить «Процесс установки базы данных первого доступа» в своем весеннем приложении, и единственное, что я могу себе представить в качестве решения, - это программная инициализация компонента 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: per@axtavt sugestion Я иду с прокси ...

<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"/>

один раз с реализованным прокси, как я могу привести его к Original Bean?

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

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

Ответы [ 3 ]

2 голосов
/ 14 марта 2010

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

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

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

-

public class MyFactory {
    public DataSource createDataSource() {
        ... // produce a DataSource
    }
}
1 голос
/ 14 марта 2010

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

<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, а параметры соединения будут управляться администратором сервера приложений. Я бы сказал, что это предпочтительный способ сделать это. Прямо сейчас у вас все еще есть пароль в виде обычного текста - плохая идея.

0 голосов
/ 13 мая 2016

Я использую тот же самый прокси-подход, который Вы упомянули. Чтобы избавиться от java.lang.ClassCastException, вы можете получить источник данных из HotSwappableTargetSource bean, как показано ниже.

HotSwappableTargetSource swapper = ctx.getBean(HotSwappableTargetSource.class);
BasicDataSource ds = (BasicDataSource) swapper.getTarget();
...