spring中jdbctemplate和事务管理的Java配置

2023-12-29

我正在使用 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 数据源,因此 jdbcTemplate 和事务管理器都使用两个不同的数据源。

所以我的问题是 -

  1. jdbcTemplate 和 transactionManager 是否使用两个不同的数据源,或者 @Bean 可以处理这种情况。
  2. 如果它们都使用两个不同的数据源,那么如何配置它们以便它们使用相同的数据源。

我可以看到在 xml 中配置它很容易,但是使用 java 配置我找不到同时使用 jdbcTemplate 和 transactionManager 的示例。


Answers

  1. @Bean 处理这个。由于您在类之上有@Configuration,那么您将以完整(相对于精简)模式进行操作,因此这些java @Bean注释的方法会被Spring拦截,并确保该方法仅被调用一次。顺便说一句,我将其称为 dataSource() 而不是 getDataSource(),因为方法名称用于 bean 名称。如果有疑问,请记录一些日志并查看控制台进行确认。
  2. 问题2.变得无关紧要。

为什么你的交易不起作用?很难说,因为您没有提供它无法工作的完整上下文,但有一些需要考虑的事情:

  1. 您是否忘记为您的方法/类添加@Transactional?
  2. 您正在使用一种不太常见的本机 AspectJ 编织方法(相对于更常见和更简单的基于 JDK 代理的方法)。我还没有使用过这个,但是根据文档,您必须以不同的方式编译/构建代码,因为它不是纯 java 方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring中jdbctemplate和事务管理的Java配置 的相关文章

随机推荐