2015-11-08 53 views
3

我使用spring jdbc支持spring jdbc。jdbctemplate的Java配置和彈簧事務管理

這是我的配置。

@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()方法,其中inturn創建jdbcDataSource。我認爲在我創建兩個jdbc dataSource的方法中,所以jdbcTemplate和事務管理器都使用兩個不同的dataSource。

所以我的問題是 -

  1. 是真的JdbcTemplate類transactionManager在使用兩個不同的數據源或@Bean可以處理這種情況。
  2. 如果它們都使用兩個不同的dataSource,那麼如何配置它們以便它們使用相同的dataSource。

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

回答

1

答案

  1. @Bean處理此。既然你在類的頂部有@Configuration,那麼你就是在完全(而不是精簡版)模式下運行,因此這些java @ Bean-annotated方法被Spring攔截,並且確保只調用一次該方法。順便說一句,我會將它稱爲dataSource()而不是getDataSource(),因爲方法名稱是針對bean名稱的。如果有疑問,然後把一些日誌記錄,並看到控制檯確認。
  2. 問題2變得無關緊要。

爲什麼您的交易不起作用?很難說,因爲你沒有提供完整的上下文無法工作,但有些事情需要考慮:

  1. 你忘了把你的方法/類的@Transactional?
  2. 您正在使用一種不太常見的本地AspectJ編織方法(與更常見和更簡單的基於JDK代理的方法相比)。我沒有使用過,但根據文檔,您不得不以不同的方式編譯/構建代碼,因爲它不是純Java方法。