我想在我的spring应用程序中创建一个"First Access Database Setup Process",我唯一想象的解决方案就是以编程方式初始化DataSource bean.
我当前的bean定义为:
<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>
Run Code Online (Sandbox Code Playgroud)
但理想的是每当我需要它时,我自己加载它并使用我定义的参数.
场景是用户(管理员)第一次来到应用程序,我问他要连接的服务器,端口和目录.我将它存储在一个embeeded db中,下次应用程序启动时,bean可以检查是否在嵌入式db上设置了参数并再次加载它.
可能吗?
EDT:每个@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"/>
Run Code Online (Sandbox Code Playgroud)
一旦使用代理实现了如何将其转换为原始Bean?
Object o = ctx.getBean("dataSource");
BasicDataSource ds = (BasicDataSource)o;
Run Code Online (Sandbox Code Playgroud)
将抛出java.lang.ClassCastException:$ Proxy4无法强制转换为org.apache.commons.dbcp.BasicDataSource
你可以创建一个工厂来生产DataSource你想要的东西:
<bean id = "dataSourceFactory" class = "MyFactory" />
<bean id = "dataSource" factory-bean = "dataSourceFactory" factory-method = "createDataSource" />
Run Code Online (Sandbox Code Playgroud)
-
public class MyFactory {
public DataSource createDataSource() {
... // produce a DataSource
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16780 次 |
| 最近记录: |