我正在使用 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 和事务管理器都使用两个不同的数据源。
所以我的问题是 -
- jdbcTemplate 和 transactionManager 是否使用两个不同的数据源,或者 @Bean 可以处理这种情况。
- 如果它们都使用两个不同的数据源,那么如何配置它们以便它们使用相同的数据源。
我可以看到在 xml 中配置它很容易,但是使用 java 配置我找不到同时使用 jdbcTemplate 和 transactionManager 的示例。
Answers
- @Bean 处理这个。由于您在类之上有@Configuration,那么您将以完整(相对于精简)模式进行操作,因此这些java @Bean注释的方法会被Spring拦截,并确保该方法仅被调用一次。顺便说一句,我将其称为 dataSource() 而不是 getDataSource(),因为方法名称用于 bean 名称。如果有疑问,请记录一些日志并查看控制台进行确认。
- 问题2.变得无关紧要。
为什么你的交易不起作用?很难说,因为您没有提供它无法工作的完整上下文,但有一些需要考虑的事情:
- 您是否忘记为您的方法/类添加@Transactional?
- 您正在使用一种不太常见的本机 AspectJ 编织方法(相对于更常见和更简单的基于 JDK 代理的方法)。我还没有使用过这个,但是根据文档,您必须以不同的方式编译/构建代码,因为它不是纯 java 方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)