Spring事务配置(bean vs内部类)

时间:2016-09-21 14:21:16

标签: spring spring-transactions

在Spring的实际应用中,我发现TransactionManager的配置是通过嵌套类实现的:

@Configuration
@ComponentScan
public class JpaConfig {

//EntityManagerFactory, JpaVendorAdapter, DataSource @Beans

  @Configuration
  @EnableTransactionManagement
  public static class TransactionConfig implements TransactionManagementConfigurer {
    @Inject
    private EntityManagerFactory emf;

    public PlatformTransactionManager annotationDrivenTransactionManager() {
      JpaTransactionManager transactionManager = new JpaTransactionManager();
      transactionManager.setEntityManagerFactory(emf);
      return transactionManager;
    }    
  }
}

这是一种好习惯还是什么?与标准的@Bean方法相比有什么不同:

@Configuration
@EnableTransactionManagement
public class DbConfig {

//EntityManagerFactory, JpaVendorAdapter, DataSource @Beans

    @Bean
    public JpaTransactionManager createTransactionManager(EntityManagerFactory emf) {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(emf);
        return jpaTransactionManager;
    }

}

或者仅仅是分离责任?

1 个答案:

答案 0 :(得分:0)

  

这是一种好习惯还是什么?与标准@Bean

相比有什么不同

这两种方法都有效,你可能已经注意到了。

第一种方法类似于inner bean概念。

如果您知道除了外部bean之外的任何其他bean都不会使用该bean,那么您可以将其声明为内部bean。这里的优点是通过将bean作为内部bean来确保它不会暴露给除外部bean之外的其他bean,因此无法在其他bean中使用/注入内部bean。

从上述链接中引用

  

内部bean定义不需要定义的id或名称;如果指定,则容器不使用此类值作为标识符。容器还会在创建时忽略范围标志:内部bean始终是匿名的,并且始终使用外部bean创建它们。无法将内部bean注入协作bean而不是封闭bean中,或者独立访问它们。