首页 > 其他分享 >多数据源,手动事务注解

多数据源,手动事务注解

时间:2024-03-21 15:57:53浏览次数:20  
标签:return Qualifier 数据源 手动 Bean dataSource 注解 new public

获取容器中的bean

@Component
public class ApplicationContextUtil implements ApplicationContextAware {
    public static ApplicationContext applicationContext;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        ApplicationContextUtil.applicationContext =   applicationContext;
    }
}

数据源配置

@Configuration
@EnableTransactionManagement
public class Gxzd37DataSourceConfig {

    /**
     * 数据源37
     */
    @Bean(name = "dataSource37")
    @ConfigurationProperties(prefix = "spring.37datasource.druid")
    public DruidDataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "jdbcTemplate37")
    public JdbcTemplate jdbcTemplate(@Qualifier("dataSource37") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "namedParameterJdbcTemplate37")
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("dataSource37") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
    @Bean("transactonManager37")
    public PlatformTransactionManager getTransactionManager(@Qualifier("dataSource37")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

}




@Configuration
@EnableTransactionManagement
public class Gxzd47DataSourceConfig {

    /**
     * 数据源47
     */
    @Bean(name = "dataSource47")
    @ConfigurationProperties(prefix = "spring.gxzd47datasource.druid")
    public DruidDataSource dataSource() {
        return new DruidDataSource();
    }

    @Bean(name = "jdbcTemplate47")
    public JdbcTemplate jdbcTemplate(@Qualifier("dataSource47") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "namedParameterJdbcTemplate47")
    public NamedParameterJdbcTemplate namedParameterJdbcTemplate(@Qualifier("dataSource47") DataSource dataSource) {
        return new NamedParameterJdbcTemplate(dataSource);
    }
    @Bean("transactonManager47")
    public PlatformTransactionManager getTransactionManager(@Qualifier("dataSource47")DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
}

 

事务注解

/**
 * @description: 共享字典手动事务注解
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface GxzdTranstionManager {
    String[] transactonManagers() default {};
}

 

切面类

@Component
@Aspect
@Order(-1)
public class GxzdTranstionManagerAOP{

    @Pointcut(value = "@annotation(cn.crl.zdgl.config.GxzdTranstionManager)")
    public void methodPointcut(){}

    @Around(value = "methodPointcut()")
    public Object transactionalAspectAround(ProceedingJoinPoint point) throws Throwable {
        MethodSignature signature = (MethodSignature)point.getSignature();
        Method method = signature.getMethod();
        GxzdTranstionManager annotation = method.getAnnotation(GxzdTranstionManager.class);
        String[] managers = annotation.transactonManagers();

        // 放入栈中,保证先进后出,防止ransaction synchronization is not active
        Stack<PlatformTransactionManager> managerStack = new Stack<>();
        Stack<TransactionStatus> statusStack = new Stack<>();

        if(managers.length > 0){
            for (String managerName : managers) {
                PlatformTransactionManager manager = (PlatformTransactionManager)ApplicationContextUtil.applicationContext.getBean(managerName);
                TransactionStatus transactionStatus = manager.getTransaction(new DefaultTransactionDefinition());
                managerStack.push(manager);
                statusStack.push(transactionStatus);
            }
        }
        try {
            Object proceed = point.proceed();

            while (!managerStack.isEmpty()){
                managerStack.pop().commit(statusStack.pop());
            }
            return proceed;
        } catch (Throwable throwable) {
            throwable.printStackTrace();

            while (!managerStack.isEmpty()){
                managerStack.pop().rollback(statusStack.pop());
            }
             throw new Exception(throwable);

        }
    }
}

 

业务类

@Service
public class Service {

  @Autowired
    @Qualifier("jdbcTemplate37")
    private JdbcTemplate jdbcTemplate37;
    @Autowired
    @Qualifier("jdbcTemplate47")
    private JdbcTemplate jdbcTemplate47;

 @GxzdTranstionManager(transactonManagers = {"transactonManager37","transactonManager47"})
    public Integer add(Object object){
  
        new OtherDao(jdbcTemplate37).add(object));
        new OtherDao(jdbcTemplate47).add(object));
        return 1;
    }

}

 

标签:return,Qualifier,数据源,手动,Bean,dataSource,注解,new,public
From: https://www.cnblogs.com/szc1998/p/18087550

相关文章

  • 若依基本框架内容介绍、多数据源配置、命令、自定义打包脚本
    若依是一个能够帮助我们快速搭建一个管理平台的开发框架官网地址:https://doc.ruoyi.vip/ruoyi/ 一、基本框架内容介绍二、多数据源配置三、命令、自定义打包脚本 一、基本框架内容1.文件结构Common:用的比较多的是utils包中的工具(处理字符串、日期、获取ip、发送请求、......
  • 当@Async注解遇上Spring的循环依赖:一个故障排查之旅
    在Java后端开发中,Spring框架无疑是一个强大的助手,它以简单的方式帮助我们管理依赖项、配置和创建异步任务。然而,即使在这个成熟的框架中,也会有一些坑会让开发者头疼。今天,我们就来聊聊Spring中的一个常见问题——当@Async注解遇上循环依赖时会发生什么。问题的起源一位工......
  • 【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现
    文章目录引入认识YAML格式规范定义脱敏规则格式脱敏逻辑实现读取YAML配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后对数据进行脱敏处理递归生成字段对应的键路径脱敏测试完整工具类引入在项目中遇到一个需求,需要对交易接口返回结果中的指定字段......
  • Spring中@NotNull注解@Valid注解简介及使用
    前言在开发中,为了代码的稳定性不报空指针异常,经常需要判断前端传过来的值是否为空,为空的话就返回前端值为空的提示,才能进行下一步的操作,例如登录操作需要判断传过来的登录名和密码是否为空:@GetMapping("login")publicResultlogin(Useruser){if(StringUti......
  • SpringBoot 多数据源 - dynamic-datasource | 快速入门
    文章目录简介第1步:引入依赖第2步:配置数据源多种配置数据源的形式数据源配置示例第3步:使用@DS注解切换数据源@DS注解详解@DS注解使用案例......
  • 利用CrewAI框架打造高效自动化周报系统:告别手动报告,迎接智能协作
    在日常工作中,编写个人和团队的工作周报是一项既繁琐又枯燥的任务。幸运的是,这种场景非常适合利用人工智能(AI)技术来简化。尽管市面上已有多种基于GPT的智能体,如国内的文心一言、讯飞星火、智谱清言等,它们能够对用户提供的内容进行总结,但如果没有用户输入,它们便无法凭空创造内容......
  • Spring JdbcTemplate+Druid数据源+FreeMarker 开发代码生成器
    虽然在这个时代,几乎所有成熟的开发框架都自带代码生成器,但有时候我们难免会遇到没有代码生成器的开发框架,这个时候,自己手中有一套代码生成器,把模版文件调整一下立马就能用,这就比较惬意了。这里讲一下如何利用SpringJdbcTemplate+Druid数据源+FreeMarker开发一套代码生成器。......
  • 多数据源加密(90%来自文心一言)
    在dynamic-datasource-spring-boot-starter3.2.0中,如果你希望对加密的密码进行自定义解密,你需要实现自己的PropertySourceLocator或者自定义配置解析逻辑,以便在读取配置时能够自动解密密码。以下是实现自定义解密逻辑的一般步骤:创建自定义的解密工具类首先,你需要一个能......
  • Java自定义注解实现参数校验
    1、定义注解内    自定义如下,本例子以校验手机号码为例需要校验手机号码标上此注解即可。其中Mobilelidator类则是实现自定义校验ConstraintValidator类的接口实现类2、ConstraintValidator 定义接口实现  ConstraintValidator 自定义接口实现如下图......
  • 手动安装deb包,用dpkg和ap-get方式
    apt-get安装deb的包在Linux系统中,使用apt-get命令安装.deb包是一个常见的操作。以下是一个简单的命令示例,用于安装一个名为package.deb的本地.deb包:sudoapt-getinstall./package.deb如果你需要从远程仓库安装一个.deb包,你可以先使用dpkg安装.deb包,如下所示:s......