春天的jdbctemplate和事务管理的Java配置

时间:2015-11-08 13:46:15

标签: spring jdbc transactions

我使用spring jdbc和spring jdbc事务支持。

这是我的配置。

@Configuration
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)
@EnableGlobalMethodSecurity(securedEnabled = true)
@PropertySource(name = "props", value = { "classpath:common/jdbc.properties", "classpath:common/mail.properties",
        "classpath:common/message.properties", "classpath:common/common.properties" })
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${jdbc.url}")
    private String jdbcURL;

    @Value("${jdbc.username}")
    private String jdbcUsername;

    @Value("${jdbc.password}")
    private String jdbcPassword;

    @Value("${jdbc.driver}")
    private String jdbcDriver;

    /**
     * configure jdbc datasource
     * 
     * @return DataSource
     */
    @Bean
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource(jdbcURL, jdbcUsername, jdbcPassword);
        dataSource.setDriverClassName(jdbcDriver);
        return dataSource;
    }

    /**
     * configure jdbc template
     * 
     * @return JdbcTemplate
     */
    @Bean
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(getDataSource());
    }

    @Bean
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(getDataSource());
    }
}

使用此配置事务对我不起作用。我不确定原因,但我能理解的是 -

正如您可以看到jdbcTemplate()和txManager()这两个方法都调用了getDataSource()方法,该方法创建了jdbcDataSource。我认为在我创建两个jdbc dataSource的方法中,所以jdbcTemplate和事务管理器都使用两个不同的dataSource。

所以我的问题是 -

  1. 是真的jdbcTemplate和transactionManager正在使用两个不同的数据源,或者@Bean可以处理这种情况。
  2. 如果他们都使用两个不同的dataSource,那么如何配置它们以便它们使用相同的dataSource。
  3. 我可以看到在xml中配置它很容易,但是使用java配置我找不到使用jdbcTemplate和transactionManager的示例。

1 个答案:

答案 0 :(得分:1)

答案

  1. @Bean处理这个。由于你在类之上有@Configuration,所以你在完全(而不是精简版)模式下运行,因此这些java @ Bean注释的方法被Spring拦截,并且确保该方法只被调用一次。顺便说一句,我称之为dataSource()而不是getDataSource(),因为方法名称是针对bean名称的。如果有疑问,请进行一些记录并查看控制台以确认。
  2. 问题2.变得无关紧要。
  3. 为什么您的交易无效?很难说,因为你没有提供它无法工作的完整背景,但有些事情需要考虑:

    1. 您是否忘记为您的方法/类添加@Transactional?
    2. 您正在使用一种不那么常见的原生AspectJ编织方法(相对于更常见和更简单的基于JDK代理的方法)。我还没有使用它,但是根据文档,你必须以不同的方式编译/构建你的代码,因为它不是纯粹的java方法。