当前位置: 首页 > 知识库问答 >
问题:

Spring从配置java文件禁用@Transactional

苗信鸥
2023-03-14
@Configuration
@EnableTransactionManagement
@PropertySource("classpath:application.properties")

public class WebAppConfig {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";

    @Resource
    private Environment env;

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(url);
        dataSource.setUsername(userId);
        dataSource.setPassword(password);

        return dataSource;
    }
    @Bean
    public PlatformTransactionManager txManager() {
         DefaultTransactionDefinition def = new DefaultTransactionDefinition();
         def.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
            if(appName.equqls("ABC")) {
                def.setPropagationBehavior(TransactionDefinition.PROPAGATION_NEVER);
                }else {
                    def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
                }
         CustomDataSourceTransactionManager txM=new CustomDataSourceTransactionManager(def);
         txM.setDataSource(dataSource());
    return txM;
    }


    @Bean
    public JdbcTemplate jdbcTemplate() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        return jdbcTemplate;
    }

}

如果我保留@transactional(propagation=propagation.never),那么所有的东西都可以很好地工作,但是我不能修改它,因为另一个应用程序正在使用相同的代码库,在这种情况下,它是必要的。

我想知道是否有一个使事务从配置完全禁用而不修改@transactional注释。

共有1个答案

濮阳振海
2023-03-14

我不确定它是否可行,但您可以尝试实现自定义TransactionInterceptor并通过删除事务性内容来覆盖它的方法,该方法将调用包装到事务中。类似这样的事情:

public class NoOpTransactionInterceptor extends TransactionInterceptor {

    @Override
    protected Object invokeWithinTransaction(
        Method method, 
        Class<?> targetClass, 
        InvocationCallback invocation
    ) throws Throwable {
        // Simply invoke the original unwrapped code
        return invocation.proceedWithInvocation();
    }
}

然后在@configuration类中声明一个条件bean

// assuming this property is stored in Spring application properties file
@ConditionalOnProperty(name = "turnOffTransactions", havingValue = "true")) 
@Bean   
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public TransactionInterceptor transactionInterceptor(
         /* default bean would be injected here */
         TransactionAttributeSource transactionAttributeSource
) {
    TransactionInterceptor interceptor = new NoOpTransactionInterceptor();
    interceptor.setTransactionAttributeSource(transactionAttributeSource);
    return interceptor;
}

也许你需要更多的配置,我现在无法确认

 类似资料:
  • 我想实现以下目标: 在“开发”模式下,在当前webapp中执行Spring云配置 因此,当前webapp的类路径包含对配置服务器和客户端的依赖关系: 在开发模式下,并在引导程序中具有以下属性。yml,没问题(嵌入式配置服务器已配置并启动) 当不在'dev'模式(例如spring.profiles.active=prod)时,当前的webapp不会启动:它无法自动装配我的属性(我猜嵌入式服务器是以错

  • 我不确定我是否很好地理解了Spring概要文件是如何处理yaml和属性文件的。我试图将这两种类型的配置分开(这两个文件不共享任何配置),但在从yaml配置中读取配置文件时遇到了问题。 我的问题是,当我试图(通过xml)配置我的数据源时,这样做: Spring总是使用YAML文件中的最后一个配置,忽略概要文件。我试图通过web.xml中的contex-parameter或直接将活动概要文件传递给JV

  • 问题内容: 有人可以告诉我如何使用Java为我的客户firefox配置文件禁用插件吗?我发现有几个网站显示要添加加载项,但是关于禁用插件一无所获。 我的Firefox配置文件: 问题是默认情况下启用了某些插件。Adobe Acrobat,Google Update,Java,Microsoft Office,Flash,Director和Silverlight的Shockwave。 我需要禁用其中

  • 问题内容: 有人可以告诉我如何使用Java为我的客户firefox配置文件禁用插件吗?我发现有几个网站显示要添加加载项,但是关于禁用插件一无所获。 我的Firefox配置文件: 问题是默认情况下启用了某些插件。Adobe Acrobat,Google Update,Java,Microsoft Office,Flash,Director和Silverlight的Shockwave。 我需要禁用其中

  • 我正在试着做一双Spring靴。通过AWS ElasticBeanstalk制作罐子。一切正常,配置文件为“默认”。有人知道如何为java ElasticBeanstalk应用程序(而不是tomcat)设置活动配置文件(spring.profiles.active)吗。我总是得到“无活动配置文件集,返回默认配置文件:默认”。有没有办法直接设置虚拟机选项? 我已经在AWS管理控制台中设置了“spri

  • 目录: 在配置项目yml文件中: 问题: null 客户端YML: 有没有人知道我怎样才能在这两种情况下只带一个配置文件?