【发布时间】:2011-01-27 11:00:54
【问题描述】:
我想在我的 spring 应用程序中创建一个“首次访问数据库设置过程”,我唯一能想到的解决方案就是以编程方式初始化 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>
但理想的做法是在需要时自行加载它并使用我定义的参数。
场景是用户(管理员)第一次来到应用程序,我问他要连接的服务器、端口和目录。我将它存储在嵌入式数据库中,下次应用程序启动时,bean 可以检查是否在嵌入式数据库上设置了参数并再次加载。
有可能吗?
美国东部时间: 根据@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"/>
一旦实现了代理,我如何将其转换为原始 Bean?
Object o = ctx.getBean("dataSource");
BasicDataSource ds = (BasicDataSource)o;
会抛出 java.lang.ClassCastException: $Proxy4 cannot be cast to org.apache.commons.dbcp.BasicDataSource
【问题讨论】:
-
static.springsource.org/spring/docs/2.0.x/api/org/… 可以提供帮助,但我不确定它是否是最新的
-
发现了这一点:它更多的是关于使用代理的可交换数据源。 affy.blogspot.com/2007/11/…
标签: spring datasource