spring - 在代码上定义 DataSource bean

标签 spring datasource

我想在我的 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 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"/>

一旦实现了代理,我该如何将其转换为原始 Bean?
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
    }
}

关于spring - 在代码上定义 DataSource bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2443460/

相关文章:

java - Tomcat 7,Spring rest 模板应用程序在浏览器中生成 err_invalid_chunked_encoding

java - 无法调用 persistence.xml 文件中的 JNDI 资源

带有 Quartz 和 Tomcat 数据源的 SpringBoot : Driver's Blob representation is of an unsupported type: oracle. sql.BLOB

Spring + 内存中的多个H2实例

java - Spring boot + hikari - dataSource 或 dataSourceClassName 或 jdbcUrl 是必需的问题

java - Spring PageableArgumentResolver 已弃用,如何使用 PageableHandlerMethodArgumentResolver?

spring - 如何在 MyBatis 中使用 PagingAndSorting?

java - IntelliJ 中的 Spring Web Flow 支持

java - ViewResolver 不解析 View 名称,而是请求 URL,Spring 3.0

java - 防止 Spring 容器对提供的 Bean 执行注入(inject)