【问题标题】:Use Spring's TransactionAwareDataSourceProxy in code, not xml在代码中使用 Spring 的 TransactionAwareDataSourceProxy,而不是 xml
【发布时间】:2020-06-05 02:40:56
【问题描述】:

我正在尝试get jOOQ transactions to work,除了使用代码而不是 XML 配置。我觉得应该很简单

// inside @Configuration annotated class
@Bean
public DataSource makeTransactionAware(DataSource fromConnectionPool) {
  return new TransactionAwareDataSourceProxy(fromConnectionPool);
}

除了,我需要告诉 Spring 注入的DataSource 与方法返回的不是同一个。我该怎么做?

【问题讨论】:

    标签: java spring jooq spring-transactions


    【解决方案1】:

    Bean 自定义命名和限定符应该为您完成工作。

    https://www.baeldung.com/spring-qualifier-annotation

    @Bean(name = "txAwareDS")
    public DataSource makeTransactionAware(@Qualifier("dataSource") DataSource fromConnectionPool) {
        return new TransactionAwareDataSourceProxy(fromConnectionPool);
    }
    

    示例代码只是一个起点。

    【讨论】:

    • 好的,这是一个好的开始。现在,限定符和新 bean 需要哪些名称,以便在正确的地方使用它们?这些都是Spring自己配置的,我无法控制。
    • 那么可以用@Primary注解操作吗?是否要将两个 bean(“dataSource”和“txAwareDS”)连接到指定位置?所以在一种情况下(这是一个 Spring OOTB 功能)您确实需要事务感知,但在其他情况下(这也是一个 Spring OOTB 功能)您确实想要使用简单的数据源?
    【解决方案2】:

    来自Spring configuration file分享

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close" >
        <!-- These properties are replaced by Maven "resources" -->
       <property name="url" value="${db.url}" />
       <property name="driverClassName" value="${db.driver}" />
       <property name="username" value="${db.username}" />
       <property name="password" value="${db.password}" />
    </bean>
    <bean id="transactionAwareDataSource"
            class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
            <constructor-arg ref="dataSource" />
     </bean>
    

    将被配置为

    @Configuration
    @PropertySource("classpath:config.properties")
    public class DataSourceConfig{
    
        @Value("${db.username}")
        private String username;
        @Value("${db.password}")
        private String password;
        @Value("${db.url}")
        private String url;
    
            @Bean
            public DataSource dataSource() {
                BasicDataSource basicDataSource = new BasicDataSource();
                basicDataSource.setDriverClassName("<driver class name>"); // Spring will load the driver discovered if not specified explicitly.
                basicDataSource.setUsername(username);
                basicDataSource.setPassword(password);
                basicDataSource.setUrl(url);
             return basicDataSource;
            }
    
            @Bean
            public TransactionAwareDataSourceProxy transactionAwareDataSource(DataSource dataSource) {
                return new TransactionAwareDataSourceProxy(dataSource)
            }
        }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-25
      • 2013-06-05
      • 2013-08-31
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多