繁体   English   中英

Spring 4使用基于类的数​​据库初始化而不是xml bean

[英]Spring 4 using class based database initialization instead of xml bean

在我们的Spring 4应用程序中,当前我们在applicationContext.xml中配置数据库连接:

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="springHikariCP" />
    <property name="dataSourceClassName" value="org.postgresql.ds.PGSimpleDataSource" />
    <property name="maximumPoolSize" value="10" />
    <property name="idleTimeout" value="30000" />

    <property name="dataSourceProperties">
        <props>
            <prop key="url">jdbc:postgresql://google/mydb?cloudSqlInstance=project:region:myinstance&amp;socketFactory=com.google.cloud.sql.postgres.SocketFactory</prop>
            <prop key="user">postgres</prop>
            <prop key="password">password</prop>
        </props>
    </property>
</bean>

代替在applicationContext.xml中定义它,我可以在诸如以下的类中定义数据库配置:

HikariConfig config = new HikariConfig();
config.setJdbcUrl(JDBC_URL);
config.setUsername(DB_USER);
config.setPassword(DB_PASS);
....

是否有可能做到这一点?

您可以在HikariDataSource上定义属性

public DataSource getDataSource(){ 
   HikariDataSource dataSource = new HikariDataSource();
   dataSource.setJdbcUrl(JDBC_URL);
   dataSource.setUsername(DB_USER);
   dataSource.setPassword("DB_PASS);
   return dataSource;
}
 public class HikariDataSource extends HikariConfig implements DataSource, Closeable 

然后在@Configuration@Bean您的方法声明为@Bean

@Bean
public DataSource dataSource() {
    return DataSourceClass.getDataSource();
}

这是更通用的解决方案中的王者,不是特定于您的DataSource的,但它可能会有用:

@Configuration
public class DataSourceConfig {

    @Bean
    public DataSource getDataSource() {
        DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
        dataSourceBuilder.driverClassName("org.h2.Driver");
        dataSourceBuilder.url("jdbc:h2:mem:test");
        dataSourceBuilder.username("SA");
        dataSourceBuilder.password("");
        return dataSourceBuilder.build();
    }
}

您真正需要的是一个DataSource bean(在XML中定义一个bean,对吗?)并将其放入@Configuration类中,以便Spring可以将其拾取。

您在该方法中输入的内容应返回为您的特定案例数据源预先配置的内容。

另外,您可以尝试如下操作:

@Bean
public DataSource dataSource() throws SQLException {
    HikariConfig config = new HikariConfig("/hikari.properties");
    HikariDataSource dataSource = new HikariDataSource(config);

    return dataSource;
}

但是,那么您需要在类路径中hikari.properties文件。 例:

driverClassName=com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://localhost:3306/myDb
connectionTestQuery=SELECT 1
maximumPoolSize=20
username=...
password=...

记住将@Bean保留在@Configuration :)

只需使用@Configuration注释一个类,确保在应用程序启动时由Spring扫描此类。 在此类中,以这种方式将数据源声明为@Bean

@Configuration
public class DataSourceConfig {

// More code...

    @Bean(name="datasource")
    public DataSource dataSource() {

        HikariConfig hikariConfig = new HikariConfig();

        hikariConfig.setDriverClassName(org.postgresql.Driver.class.getName());
        hikariConfig.setJdbcUrl("jdbc:postgresql://....");
        hikariConfig.setUsername("postgres");
        hikariConfig.setPassword("password");
        hikariConfig.setMaximumPoolSize(10);
        hikariConfig.setIdleTimeout(30000);
        hikariConfig.setPoolName("springHikariCP");

        HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig);

        return hikariDataSource;    

    }

// More code...

}

就这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM