Spring 使用 Spring 4.3.4 版本以编程方式配置事务

Spring Transaction configuration programmatically with Spring 4.3.4 version

我们目前正在从 xml 配置迁移到基于 java 配置的 Spring 应用程序完成注释。使用注释方法 @Transactional 我们可以实现,但我们需要为每个方法编写。

在 XML 中我们配置了 (OLD)。

<bean id="txProxyTemplate" abstract="true"
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager">
            <ref bean="transactionManager" />
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="delete*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
                <prop key="update*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
                <prop key="save*">PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED</prop>
                <prop key="get*">PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITTED,readOnly</prop>
                <prop key="is*">PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITTED,readOnly</prop>
                <!--<prop key="*">PROPAGATION_REQUIRED</prop> -->
            </props>
        </property>
    </bean>

transactionManagerorg.springframework.orm.hibernate3.HibernateTransactionManager

<bean id="xxxxSVC" parent="txProxyTemplate">
        <property name="target">
            <bean class="XXX.XXX.XXX.SVCImpl">
                <property name="xxxxDao" ref="xxxDao"></property>

            </bean>
        </property>
    </bean>

txProxyTemplate 是每个服务 class.

的父级 class

所以,请建议如何在 java 配置中配置类似的代码。感谢您花费宝贵的时间支持我们。

@Barath 评论

豆子

@Bean
    public TransactionProxyFactoryBean setTransactionProperties() throws IOException {
        TransactionProxyFactoryBean transactionProxyFactoryBean = new TransactionProxyFactoryBean();
        transactionProxyFactoryBean.setTransactionManager(transactionManager(sessionFactory()));
        Properties transactionAttributesProps = new Properties();
        transactionAttributesProps.setProperty("delete*", "PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED");
        transactionAttributesProps.setProperty("update*", "PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED");
        transactionAttributesProps.setProperty("save*", "PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED");
        transactionAttributesProps.setProperty("get*", "PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITTED,readOnly");
        transactionAttributesProps.setProperty("is*", "PROPAGATION_SUPPORTS,ISOLATION_READ_COMMITTED,readOnly");
        transactionProxyFactoryBean.setTransactionAttributes(transactionAttributesProps);

        transactionProxyFactoryBean.afterPropertiesSet();
        return transactionProxyFactoryBean;
    }

每个服务实现如何配置class,我们可以单独使用,因为一个服务层可能包含N个classes。有一个方法 setTarget(Object target)。现在我们如何配置所有 N classes。请建议我们如何配置。

此案例的示例配置:

    @Bean
    public TransactionProxyFactoryBean txProxyTemplate(){

        TransactionProxyFactoryBean txFactory=new TransactionProxyFactoryBean();
        txFactory.setTransactionManager(new JpaTransactionManager()); // any transcation manager 
        txFactory.setTransactionAttributes(properties());
        return txFactory;

    }

    @Bean 
    Properties properties(){
        Properties properties=new Properties();
        properties.put("delete*", "PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED");
        //set al lthe properties
        return  properties;
    }


    @Bean
    public TransactionProxyFactoryBean  xxxxSVC(TransactionProxyFactoryBean txFactory){
        txFactory.setTarget(testEntity());
        return txFactory;
    }

    @Bean 
    TestEntity  testEntity(){
        return new TestEntity();
    }